/ Hex Artifact Content
Login

Artifact 5419fcd2faa02b7759051495a5e339444c679205:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 35 31 31 20 32 30 30 38 2f 30  c,v 1.511 2008/0
0190: 39 2f 31 30 20 31 37 3a 35 33 3a 33 36 20 64 61  9/10 17:53:36 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65  builds..*/.#ifde
0530: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0540: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0550: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0560: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0570: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0580: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0590: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
05a0: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
05b0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
05c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
05d0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
05e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05f0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
0600: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
0610: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0620: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0630: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0650: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0660: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0680: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0690: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
06a0: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
06b0: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
06c0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
06d0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
06e0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
06f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0700: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0710: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0720: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0730: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0740: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0750: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0760: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0770: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  .../*.** Forward
0780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
0790: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
07a0: 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a  ReadLocks(Btree*
07b0: 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72  , Pgno, BtCursor
07c0: 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65  *, i64);...#ifde
07d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
07e0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
07f0: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0800: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0810: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0820: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0830: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0840: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0850: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0860: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0870: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
0880: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0890: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08a0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08b0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08c0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08d0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
08e0: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
08f0: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0900: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0910: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0920: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0930: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0940: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0950: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0960: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0970: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
0980: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
0990: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09a0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09b0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09c0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09d0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
09e0: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
09f0: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a20: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a30: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a40: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a50: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a60: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a70: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0a80: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0aa0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ab0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ac0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0ad0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0ae0: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0af0: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b00: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b20: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b30: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b40: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b50: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b60: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b70: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0b80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
0b90: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
0ba0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
0bb0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
0bc0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
0bd0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
0be0: 21 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  !=0 );.  .  /* T
0bf0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0c00: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0c10: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0c20: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0c30: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0c40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0c50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0c60: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0c70: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0c80: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0c90: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ca0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0cb0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0cc0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0cd0: 45 78 63 6c 75 73 69 76 65 20 26 26 20 70 42 74  Exclusive && pBt
0ce0: 2d 3e 70 45 78 63 6c 75 73 69 76 65 21 3d 70 20  ->pExclusive!=p 
0cf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0d00: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
0d10: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f  ..  /* This (alo
0d20: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c  ng with lockTabl
0d30: 65 28 29 29 20 69 73 20 77 68 65 72 65 20 74 68  e()) is where th
0d40: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0d50: 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64  d flag is.  ** d
0d60: 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68  ealt with. If th
0d70: 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72  e caller is quer
0d80: 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d  ying for a read-
0d90: 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61  lock and the fla
0da0: 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69  g is.  ** set, i
0db0: 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  t is uncondition
0dc0: 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65  ally granted - e
0dd0: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
0de0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a   write-locks.  *
0df0: 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  * on the table. 
0e00: 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  If a write-lock 
0e10: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
0e20: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0e30: 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e  d flag.  ** is n
0e40: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20  ot considered.. 
0e50: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63   **.  ** In func
0e60: 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29  tion lockTable()
0e70: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
0e80: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
0e90: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
0ea0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
0eb0: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
0ec0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
0ed0: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
0ee0: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
0ef0: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
0f00: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
0f10: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
0f20: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
0f30: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
0f40: 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72  s do.  ** not cr
0f50: 65 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20  eate or respect 
0f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65  table locks. The
0f70: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75   locking procedu
0f80: 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77  re for a .  ** w
0f90: 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73  rite-cursor does
0fa0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a   not change..  *
0fb0: 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d  /.  if( .    0==
0fc0: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  (p->db->flags&SQ
0fd0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
0fe0: 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c  tted) || .    eL
0ff0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1000: 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53  ||.    iTab==MAS
1010: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
1020: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
1030: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
1040: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
1050: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
1060: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
1070: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
1080: 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20 20  =iTab && .      
1090: 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63      (pIter->eLoc
10a0: 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63  k!=eLock || eLoc
10b0: 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b  k!=READ_LOCK) ){
10c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
10e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1100: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1110: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
1120: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
1130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1140: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1150: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
1160: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1170: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1180: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
1190: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
11a0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
11b0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
11c0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
11d0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
11e0: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
11f0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1200: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1210: 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20  e lock is added 
1220: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51  successfully. SQ
1230: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
1240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
1250: 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e  y also be return
1260: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1270: 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65  t lockTable(Btre
1280: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c  e *p, Pgno iTabl
1290: 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20  e, u8 eLock){.  
12a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12b0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
12c0: 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42   *pLock = 0;.  B
12d0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
12e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12f0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1300: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1310: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1320: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
1330: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
1340: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a  t( p->db!=0 );..
1350: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1360: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1370: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1380: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1390: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
13a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
13c0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  sert( SQLITE_OK=
13d0: 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28  =queryTableLock(
13e0: 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b  p, iTable, eLock
13f0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
1400: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
1410: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  ed flag is set a
1420: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  nd a read-lock i
1430: 73 20 72 65 71 75 65 73 74 65 64 2c 0a 20 20 2a  s requested,.  *
1440: 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77  * return early w
1450: 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e  ithout adding an
1460: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74   entry to the Bt
1470: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
1480: 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d  t. See.  ** comm
1490: 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ent in function 
14a0: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
14b0: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f   for more info o
14c0: 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a  n handling .  **
14d0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
14e0: 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a  tted flag..  */.
14f0: 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64    if( .    (p->d
1500: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1510: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1520: 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d   && .    (eLock=
1530: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20  =READ_LOCK) &&. 
1540: 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45     iTable!=MASTE
1550: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1570: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1580: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
1590: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
15a0: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
15b0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
15c0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
15d0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
15e0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
15f0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
1600: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
1610: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
1620: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
1630: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
1640: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1650: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1660: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
1670: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
1680: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
1690: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
16a0: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
16b0: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
16c0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
16d0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
16e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
16f0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
1700: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
1710: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
1720: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
1730: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
1740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1750: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
1760: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
1770: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
1780: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
1790: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
17a0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
17b0: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
17c0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
17d0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
17e0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
17f0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
1800: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
1810: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
1820: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
1830: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
1840: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
1850: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
1860: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
1870: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
1880: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
1890: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
18a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18b0: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
18c0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
18d0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
18e0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
18f0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
1900: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1910: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1920: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
1930: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1940: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1950: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1960: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
1970: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
1980: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
1990: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
19a0: 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29   the lockTable()
19b0: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68  .** procedure) h
19c0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
19d0: 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  dle p..*/.static
19e0: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54   void unlockAllT
19f0: 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b  ables(Btree *p){
1a00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a10: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
1a20: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
1a30: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
1a40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1a50: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1a70: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
1a80: 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68  *ppIter );..  wh
1a90: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
1aa0: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
1ab0: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
1ac0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 45   assert( pBt->pE
1ad0: 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70  xclusive==0 || p
1ae0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1af0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
1b00: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1b10: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
1b20: 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f     *ppIter = pLo
1b30: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
1b40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
1b50: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
1b60: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
1b70: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
1b80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1b90: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d  pBt->pExclusive=
1ba0: 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  =p ){.    pBt->p
1bb0: 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20  Exclusive = 0;. 
1bc0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
1bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1be0: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
1bf0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
1c00: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1c10: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
1c20: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
1c30: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
1c40: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
1c50: 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  s a mutex on the
1c60: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
1c70: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1c80: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
1c90: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
1ca0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
1cb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1cc0: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
1cd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
1ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cf0: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1d00: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
1d10: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1d20: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1d30: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d50: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1d60: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1d70: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
1d80: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d90: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
1da0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1db0: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
1dc0: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1dd0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1de0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1df0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1e00: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
1e10: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
1e20: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
1e30: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
1e40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1e50: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
1e60: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
1e70: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1e80: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
1e90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ea0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1eb0: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
1ec0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1ed0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1ee0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1ef0: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
1f00: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
1f10: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
1f20: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20  erflowCache(x). 
1f30: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1f40: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1f50: 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  che(x).#endif../
1f60: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
1f70: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1f80: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
1f90: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
1fa0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
1fb0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
1fc0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
1fd0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
1fe0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
1ff0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
2000: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2010: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2020: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2030: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2040: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2050: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
2060: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
2070: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2080: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2090: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
20a0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
20b0: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
20c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
20d0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
20e0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
20f0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
2100: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
2110: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
2120: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
2130: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
2140: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
2150: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
2160: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
2170: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
2180: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
2190: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
21a0: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
21b0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
21c0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
21d0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
21e0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
21f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2200: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70  OK && 0==pCur->p
2210: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
2220: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
2230: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 43  sqlite3Malloc(pC
2240: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ur->nKey);.    i
2250: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
2260: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2270: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70  eeKey(pCur, 0, p
2280: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
2290: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
22c0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
22d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22e0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
22f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2300: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2310: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2320: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2330: 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69   !pCur->pPage->i
2340: 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e  ntKey || !pCur->
2350: 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72  pKey );..  if( r
2360: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2370: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2380: 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
2390: 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
23a0: 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  0;.    pCur->eSt
23b0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
23c0: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
23d0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
23e0: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
23f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2400: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
2410: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
2420: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
2430: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
2440: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
2450: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
2460: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
2470: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
2480: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
2490: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
24a0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
24b0: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
24c0: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
24d0: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
24e0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
24f0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
2500: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
2510: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
2520: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2530: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2550: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2560: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
2570: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
2580: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
2590: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
25a0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
25b0: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
25c0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
25d0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
25e0: 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20  =iRoot) && .    
25f0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43      p->eState==C
2600: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2610: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
2620: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2630: 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  (p);.      if( S
2640: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
2650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2660: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2680: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2690: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
26a0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
26b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
26c0: 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50  oid clearCursorP
26d0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
26e0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
26f0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2700: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
2710: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
2720: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
2730: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
2740: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2750: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
2760: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
2770: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
2780: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
2790: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
27a0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
27b0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
27c0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
27d0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
27e0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
27f0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
2800: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
2810: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
2820: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
2830: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
2840: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
2850: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
2860: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2870: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
2880: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
2890: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e  osition()..*/.in
28a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  t sqlite3BtreeRe
28b0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
28c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
28d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
28e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28f0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2900: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2910: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2920: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2930: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2940: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2950: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2960: 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2970: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2980: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2990: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
29a0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
29b0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
29c0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
29d0: 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20  r->skip);.  if( 
29e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
2a10: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
2a20: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2a30: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a40: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2a50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a60: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d  R_INVALID );.  }
2a70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a80: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
2a90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2aa0: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
2ab0: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2ac0: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
2ad0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2ae0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2af0: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
2b00: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
2b10: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2b20: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2b30: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
2b40: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
2b50: 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ion it.** was la
2b60: 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43  st placed at.  C
2b70: 75 72 73 6f 72 20 63 61 6e 20 6d 6f 76 65 20 77  ursor can move w
2b80: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
2b90: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
2ba0: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
2bb0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
2bc0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
2bd0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
2be0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
2bf0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
2c00: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
2c10: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
2c20: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
2c30: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
2c40: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
2c50: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
2c60: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
2c70: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
2c80: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
2c90: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2ca0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
2cb0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2cc0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2cd0: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
2ce0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
2cf0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
2d00: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d10: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2d20: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
2d30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
2d40: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2d50: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
2d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2d70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
2d80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d90: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2da0: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
2db0: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
2dc0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
2dd0: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
2de0: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2df0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
2e00: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2e10: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2e20: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
2e30: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2e40: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
2e50: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
2e60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
2e70: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
2e80: 61 70 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c  apPage, iPtrMap,
2e90: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
2ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2eb0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2ec0: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
2ed0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
2ee0: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2ef0: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
2f00: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
2f10: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
2f20: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2f30: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2f40: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2f50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2f60: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2f70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
2f90: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
2fa0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fc0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
2fd0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
2fe0: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2ff0: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
3000: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
3010: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
3020: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
3030: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
3040: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3050: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3060: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3070: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3090: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
30a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
30b0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
30c0: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
30d0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
30e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
30f0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
3100: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
3110: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
3120: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
3130: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
3140: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
3150: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
3160: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
3170: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
3180: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3190: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
31a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
31c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
31d0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
31e0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
31f0: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
3200: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
3210: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
3220: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
3230: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
3240: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
3250: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
3260: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
3270: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
3280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3290: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32a0: 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  PT;.  }.  iPtrma
32b0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
32c0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
32d0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32e0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
32f0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
3300: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
3310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3320: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
3330: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3340: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
3350: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72  ap, key);.  pPtr
3360: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
3370: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
3380: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
3390: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
33a0: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
33b0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
33c0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
33d0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
33e0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
33f0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
3400: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
3410: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
3420: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
3430: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
3440: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3450: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
3460: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
3470: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
3480: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
3490: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
34a0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
34b0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
34c0: 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
34d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
34e0: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
34f0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
3500: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3510: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
3520: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
3530: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
3540: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
3550: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
3560: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
3570: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
3580: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
3590: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
35a0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
35b0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
35c0: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
35d0: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
35f0: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
3600: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
3610: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
3620: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
3630: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
3640: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
3650: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
3660: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
3670: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
3680: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
3690: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
36a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
36b0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
36c0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
36d0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
36e0: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
36f0: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
3700: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3710: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3720: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
3730: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
3740: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
3750: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3760: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
3770: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
3780: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
3790: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
37a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
37b0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
37c0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
37d0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
37e0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
37f0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
3800: 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  , key);.  assert
3810: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
3820: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
3830: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
3840: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
3850: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
3860: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
3870: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
3880: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
3890: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
38a0: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
38b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
38c0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
38d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
38e0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
38f0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
3900: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
3910: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
3920: 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Put(w,x,y,z) SQL
3930: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
3940: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
3950: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
3960: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
3970: 74 4f 76 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54  tOvfl(y,z) SQLIT
3980: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
3990: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
39a0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
39b0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
39c0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
39d0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
39e0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
39f0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
3a00: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
3a10: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3a20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
3a30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3a40: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
3a50: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
3a60: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
3a70: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
3a80: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
3a90: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
3aa0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
3ab0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
3ac0: 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d  &(P)->aData[(P)-
3ad0: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49  >cellOffset+2*(I
3ae0: 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )])))../*.** Thi
3af0: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
3b00: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64   version of find
3b10: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
3b20: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
3b30: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
3b40: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20  verflow cells.  
3b50: 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74  See insert.*/.st
3b60: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65  atic u8 *findOve
3b70: 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67  rflowCell(MemPag
3b80: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
3b90: 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ell){.  int i;. 
3ba0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3bb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
3bc0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
3bd0: 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d  ;.  for(i=pPage-
3be0: 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e  >nOverflow-1; i>
3bf0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
3c00: 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t k;.    struct 
3c10: 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c  _OvflCell *pOvfl
3c20: 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70  ;.    pOvfl = &p
3c30: 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a  Page->aOvfl[i];.
3c40: 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69      k = pOvfl->i
3c50: 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69  dx;.    if( k<=i
3c60: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
3c70: 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k==iCell ){.  
3c80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76        return pOv
3c90: 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  fl->pCell;.     
3ca0: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
3cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3cc0: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
3cd0: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
3ce0: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
3cf0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
3d00: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
3d10: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
3d20: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
3d30: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
3d40: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
3d50: 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
3d60: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
3d70: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
3d80: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
3d90: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c  argument and sql
3da0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3db0: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
3dc0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3dd0: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
3de0: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
3df0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
3e00: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
3e10: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
3e20: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
3e30: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
3e40: 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  of.** sqlite3Btr
3e50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
3e60: 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d  . Using some com
3e70: 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c  pilers, this wil
3e80: 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  l be faster..*/.
3e90: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
3ea0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
3eb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
3ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3ed0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
3ee0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
3ef0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
3f00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3f10: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
3f20: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
3f30: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
3f40: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
3f50: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cture */.){.  in
3f60: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
3f70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3f80: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
3f90: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
3fa0: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3fc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
3fd0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
3fe0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ff0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
4000: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
4010: 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43   );..  pInfo->pC
4020: 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61  ell = pCell;.  a
4030: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
4040: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
4050: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d  leaf==1 );.  n =
4060: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
4070: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
4080: 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65  n==4-4*pPage->le
4090: 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  af );.  if( pPag
40a0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
40b0: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
40c0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ata ){.      n +
40d0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
40e0: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
40f0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
4100: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
4110: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b  0;.    }.    n +
4120: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
4130: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[n], (u64*)&pI
4140: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  nfo->nKey);.    
4150: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
4160: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
4170: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  {.    pInfo->nDa
4180: 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d  ta = 0;.    n +=
4190: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
41a0: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
41b0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
41c0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
41d0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
41e0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
41f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
4200: 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b  r = n;.  if( lik
4210: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
4220: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
4230: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
4240: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
4250: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
4260: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
4270: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
4280: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
4290: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
42a0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
42b0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
42d0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
42e0: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
42f0: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
4300: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
4310: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
4320: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70   nPayload;.    p
4330: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4340: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53  = 0;.    if( (nS
4350: 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a  ize & ~3)==0 ){.
4360: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b        nSize = 4;
4370: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
4380: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
4390: 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  4 */.    }.    p
43a0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53  Info->nSize = nS
43b0: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
43c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
43d0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
43e0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
43f0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
4400: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
4410: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
4420: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
4430: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
4440: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
4450: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
4460: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
4470: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
4480: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
4490: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
44a0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
44b0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
44c0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
44d0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
44e0: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
44f0: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
4500: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
4510: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
4520: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
4530: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
4540: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
4550: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
4560: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
4570: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
4580: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
4590: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
45a0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
45b0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
45c0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
45d0: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
45e0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
45f0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
4600: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
4610: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
4620: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
4630: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
4640: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
4650: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
4660: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
4670: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
4680: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
4690: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
46a0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
46b0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
46c0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
46d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
46e0: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66  ize - 4);.    if
46f0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
4700: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
4710: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73  Info->nLocal = s
4720: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
4730: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
4740: 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61  nLocal = minLoca
4750: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
4760: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
4770: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
4780: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  n;.    pInfo->nS
4790: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
47a0: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
47b0: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
47c0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
47d0: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
47e0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
47f0: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
4800: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
4810: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
4820: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
4830: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
4840: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
4850: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
4860: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
4870: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
4880: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
4890: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
48a0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
48b0: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
48c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
48d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
48e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
48f0: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
4900: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
4910: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
4920: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
4930: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4940: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
4950: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
4960: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
4970: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
4980: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
4990: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
49a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
49b0: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
49c0: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
49d0: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
49e0: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
49f0: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
4a00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
4a10: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4a20: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
4a30: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
4a40: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
4a50: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4a60: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4a70: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4a80: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
4a90: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
4aa0: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
4ab0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
4ac0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4ad0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4ae0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4af0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4b00: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4b10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4b20: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4b30: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
4b40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4b50: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
4b60: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
4b70: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
4b80: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4b90: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4ba0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4bb0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4bc0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4bd0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4be0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4bf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4c00: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
4c10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4c20: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4c30: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
4c40: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
4c50: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4c60: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4c70: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
4c90: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4ca0: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4cb0: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4cc0: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
4cd0: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4ce0: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4cf0: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
4d00: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
4d10: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
4d20: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
4d30: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
4d40: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
4d50: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
4d60: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
4d70: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
4d80: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4d90: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
4da0: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
4db0: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
4dc0: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
4dd0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
4de0: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
4df0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
4e00: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
4e10: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
4e20: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
4e30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4e40: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
4e50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4e60: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
4e70: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
4e80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4e90: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
4ea0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
4eb0: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
4ec0: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
4ed0: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
4ee0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
4ef0: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
4f00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
4f10: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
4f20: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
4f30: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
4f40: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
4f50: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
4f60: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
4f70: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
4f80: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
4f90: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
4fa0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
4fb0: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
4fc0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
4fd0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4fe0: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
4ff0: 63 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65 6e  c void defragmen
5000: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
5010: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5040: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5070: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
5080: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50a0: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
50b0: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
50c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
50d0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5100: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
5110: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
5120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5130: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
5140: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
5150: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5160: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
5170: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
5180: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
5190: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
51a0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
51b0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
51c0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
51d0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
51e0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
51f0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
5200: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
5210: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
5220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5230: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
5240: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
5250: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5260: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
5270: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
5280: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
5290: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
52a0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
52b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
52c0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
52d0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
52e0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
52f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5300: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
5310: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
5320: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
5330: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
5340: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
5350: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5360: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
5370: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5380: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5390: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
53a0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
53b0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
53c0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
53d0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
53e0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
53f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
5400: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
5410: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
5420: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
5430: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
5440: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
5450: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5460: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
5470: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
5480: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
5490: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
54a0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
54b0: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
54c0: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
54d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
54e0: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
54f0: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
5500: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
5510: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
5520: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
5530: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
5540: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
5550: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
5560: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
5570: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
5580: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
5590: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
55a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
55b0: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
55c0: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
55d0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
55e0: 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  size;.    memcpy
55f0: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74  (&data[cbrk], &t
5600: 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  emp[pc], size);.
5610: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
5620: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20  dr, cbrk);.  }. 
5630: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63   assert( cbrk>=c
5640: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
5650: 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l );.  put2byte(
5660: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
5670: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
5680: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
5690: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
56a0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
56b0: 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65  addr = cellOffse
56c0: 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d  t+2*nCell;.  mem
56d0: 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  set(&data[addr],
56e0: 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a   0, cbrk-addr);.
56f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
5700: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
5710: 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65   space on a page
5720: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5730: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
5740: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20  age->aData[] of 
5750: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
5760: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c  f.** the new all
5770: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61  ocation.  The ca
5780: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
5790: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
57a0: 6f 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20  ough.** space.  
57b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
57c0: 6c 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a  l never fail..**
57d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
57e0: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
57f0: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
5800: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
5810: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
5820: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
5830: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
5840: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
5850: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
5860: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
5870: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
5880: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
5890: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
58a0: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
58b0: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
58c0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
58d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
58e0: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
58f0: 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72  nt addr, pc, hdr
5900: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
5910: 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74  int nFrag;.  int
5920: 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   top;.  int nCel
5930: 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  l;.  int cellOff
5940: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
5950: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20  char *data;.  . 
5960: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5970: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
5980: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5990: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
59a0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
59b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
59c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
59d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
59e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
59f0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5a00: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
5a10: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
5a20: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
5a30: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
5a40: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
5a50: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
5a60: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50  rflow==0 );.  pP
5a70: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
5a80: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
5a90: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
5aa0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
5ab0: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
5ac0: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
5ad0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
5ae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
5af0: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
5b00: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5b10: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5b20: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
5b30: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
5b40: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
5b50: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5b60: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
5b70: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
5b80: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5b90: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5ba0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
5bb0: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
5bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5bd0: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
5be0: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
5bf0: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
5c00: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5c10: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5c30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5c40: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
5c50: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
5c60: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
5c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5c80: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5ca0: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
5cb0: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
5cc0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
5cd0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
5ce0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
5cf0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5d00: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5d10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5d20: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5d30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5d40: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5d50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5d60: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5d70: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5d80: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5d90: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5da0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5db0: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
5dc0: 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67  te ){.    defrag
5dd0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
5de0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
5df0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5e00: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
5e10: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
5e20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
5e30: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
5e40: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5e50: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
5e60: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
5e70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
5e80: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
5e90: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
5ea0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
5eb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
5ec0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
5ed0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
5ee0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
5ef0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
5f00: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
5f10: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
5f20: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
5f30: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
5f40: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
5f50: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
5f60: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
5f70: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
5f80: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
5f90: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
5fa0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5fb0: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
5fc0: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
5fd0: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
5fe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5ff0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6000: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
6010: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
6020: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6030: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6040: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6050: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6060: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
6070: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
6080: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
6090: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
60a0: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
60b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
60c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
60d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
60e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
60f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6100: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
6110: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
6120: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
6130: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
6140: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
6150: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
6160: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
6170: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
6180: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
6190: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
61a0: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
61b0: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
61c0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
61d0: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
61e0: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
61f0: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
6200: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
6210: 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68  reeblocks */.  h
6220: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
6230: 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20  ffset;.  addr = 
6240: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
6250: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
6260: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6270: 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67  ))<start && pbeg
6280: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  in>0 ){.    asse
6290: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
62a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
62b0: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  ze-4 );.    asse
62c0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
62d0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62  );.    addr = pb
62e0: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egin;.  }.  asse
62f0: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
6300: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6310: 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-4 );.  assert
6320: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
6330: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
6340: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
6350: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
6360: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
6370: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
6380: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6390: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
63a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
63b0: 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20   += size;..  /* 
63c0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
63d0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
63e0: 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d  .  addr = pPage-
63f0: 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a  >hdrOffset + 1;.
6400: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
6410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6420: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
6430: 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73     int pnext, ps
6440: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
6450: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
6460: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6470: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
6480: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
6490: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
64a0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
64b0: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
64c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
64d0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
64e0: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
64f0: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
6500: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
6510: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
6520: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
6530: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
6540: 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b  ert( frag<=data[
6550: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6560: 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74  +7] );.      dat
6570: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
6580: 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20  et+7] -= frag;. 
6590: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
65a0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74  ata[pbegin], get
65b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
65c0: 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32  t]));.      put2
65d0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
65e0: 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32  n+2], pnext+get2
65f0: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
6600: 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20  +2])-pbegin);.  
6610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6620: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6630: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6640: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6650: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
6660: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
6670: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
6680: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
6690: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
66a0: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
66b0: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
66c0: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
66d0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
66e0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
66f0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
6700: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
6710: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
6720: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6730: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
6740: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
6750: 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74  dr+5], top + get
6760: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6770: 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  in+2]));.  }.}..
6780: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
6790: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
67a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
67b0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
67c0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
67d0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
67e0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
67f0: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
6800: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
6810: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
6820: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
6830: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
6840: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
6850: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
6860: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
6870: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
6880: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
6890: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
68a0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
68b0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
68c0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
68d0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
68e0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
68f0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
6900: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
6910: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
6920: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
6930: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
6940: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
6950: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
6960: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
6970: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
6980: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
6990: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
69a0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
69b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
69c0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
69d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
69e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 66   pPage->leaf = f
69f0: 6c 61 67 42 79 74 65 3e 3e 33 3b 20 20 61 73 73  lagByte>>3;  ass
6a00: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
6a10: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
6a20: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
6a30: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
6a40: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
6a50: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
6a60: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6a70: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
6a80: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
6a90: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
6aa0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6ab0: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
6ac0: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
6ad0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
6ae0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
6af0: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
6b00: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
6b10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
6b20: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
6b30: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
6b40: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
6b50: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
6b60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
6b70: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
6b80: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
6b90: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
6ba0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6bb0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
6bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6bd0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6be0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
6bf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6c00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6c10: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
6c20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
6c30: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
6c40: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
6c50: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
6c60: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
6c70: 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63  the MemPage whic
6c80: 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65  h.** is the pare
6c90: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 62  nt of the page b
6ca0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
6cb0: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  .  The root of a
6cc0: 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f  .** BTree has no
6cd0: 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66   parent and so f
6ce0: 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20 70 50  or that page, pP
6cf0: 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a  arent==NULL..**.
6d00: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
6d10: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
6d20: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
6d30: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
6d40: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
6d50: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6d60: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
6d70: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
6d80: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
6d90: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
6da0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
6db0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
6dc0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6dd0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
6de0: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
6df0: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
6e00: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
6e10: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
6e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
6e30: 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
6e40: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
6e50: 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
6e60: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
6e70: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
6e80: 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ent       /* The
6e90: 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20   parent.  Might 
6ea0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6eb0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6ec0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6ed0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
6ee0: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
6ef0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  [] */.  int hdr;
6f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6f10: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
6f20: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
6f30: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
6f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
6f50: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
6f60: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
6f70: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
6f80: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
6f90: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
6fa0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
6fb0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
6fc0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
6fd0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ch page */.  int
6fe0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
6ff0: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
7000: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
7010: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
7020: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
7030: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
7040: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
7050: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
7060: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
7080: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
7090: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
70a0: 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  */..  pBt = pPag
70b0: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
70c0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ( pBt!=0 );.  as
70d0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30  sert( pParent==0
70e0: 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74   || pParent->pBt
70f0: 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ==pBt );.  asser
7100: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7110: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7130: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
7140: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
7150: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
7160: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
7170: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
7180: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
7190: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
71a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
71b0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
71c0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
71d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
71e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 70  ;.  if( pPage==p
71f0: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 72 65  Parent ){.    re
7200: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7210: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7220: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
7230: 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20 28  nt!=pParent && (
7240: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
7250: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49 6e  0 || pPage->isIn
7260: 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  it) ){.    /* Th
7270: 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 68  e parent page sh
7280: 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e 67  ould never chang
7290: 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c  e unless the fil
72a0: 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f 0a  e is corrupt */.
72b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
72c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
72d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
72e0: 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  >isInit ) return
72f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
7300: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
7310: 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d  ==0 && pParent!=
7320: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 ){.    pPage->
7330: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
7340: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  t;.    sqlite3Pa
7350: 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
7360: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
7370: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7380: 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
7390: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
73a0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
73b0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
73c0: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
73d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
73e0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
73f0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
7400: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
7410: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
7420: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
7430: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
7440: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
7450: 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ow = 0;.  pPage-
7460: 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
7470: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
7480: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
7490: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
74a0: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
74b0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
74c0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f  Page->leaf;.  to
74d0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
74e0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70 50  ta[hdr+5]);.  pP
74f0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
7500: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7510: 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  3]);.  if( pPage
7520: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
7530: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
7540: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
7550: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
7560: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
7570: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
7580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7590: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
75a0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
75b0: 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ell==0 && pParen
75c0: 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d  t!=0 && pParent-
75d0: 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
75e0: 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73  /* All pages mus
75f0: 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  t have at least 
7600: 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74  one cell, except
7610: 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20   for root pages 
7620: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
7630: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7640: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  T;.  }..  /* Com
7650: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
7660: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
7670: 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20   page */.  pc = 
7680: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7690: 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20  dr+1]);.  nFree 
76a0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
76b0: 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65  top - (cellOffse
76c0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
76d0: 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  ll);.  while( pc
76e0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65  >0 ){.    int ne
76f0: 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66  xt, size;.    if
7700: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
7710: 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  4 ){.      /* Fr
7720: 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  ee block is off 
7730: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
7740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7750: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7760: 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d 20     }.    next = 
7770: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
7780: 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  c]);.    size = 
7790: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
77a0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  c+2]);.    if( n
77b0: 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
77c0: 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20  c+size+3 ){.    
77d0: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
77e0: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65   must be in acce
77f0: 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
7800: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7810: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7820: 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72 65   .    }.    nFre
7830: 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 70  e += size;.    p
7840: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  c = next;.  }.  
7850: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e  pPage->nFree = n
7860: 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72 65  Free;.  if( nFre
7870: 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  e>=usableSize ){
7880: 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61  .    /* Free spa
7890: 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ce cannot exceed
78a0: 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65   total page size
78b0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
78c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
78d0: 50 54 3b 20 0a 20 20 7d 0a 0a 23 69 66 20 30 0a  PT; .  }..#if 0.
78e0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
78f0: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
7900: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
7910: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
7920: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
7930: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
7940: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
7950: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
7960: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
7970: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
7980: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
7990: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
79a0: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
79b0: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
79c0: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
79d0: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
79e0: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
79f0: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
7a00: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
7a10: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
7a20: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
7a30: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
7a40: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
7a50: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
7a60: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
7a70: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
7a80: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
7a90: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
7aa0: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
7ab0: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
7ac0: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
7ad0: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
7ae0: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
7af0: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
7b00: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
7b10: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
7b20: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
7b30: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
7b40: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
7b50: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
7b60: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
7b70: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
7b80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7b90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ba0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7bb0: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
7bc0: 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
7bd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7be0: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
7bf0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
7c00: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
7c10: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
7c20: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
7c30: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7c40: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
7c50: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
7c60: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
7c70: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
7c80: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
7c90: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
7ca0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
7cb0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
7cc0: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
7cd0: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
7ce0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
7cf0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
7d00: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
7d10: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
7d20: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
7d30: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
7d40: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
7d50: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
7d60: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7d70: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
7d80: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
7d90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7da0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7db0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
7dc0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7dd0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7de0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7df0: 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26   );.  /*memset(&
7e00: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
7e10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7e20: 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68  hdr);*/.  data[h
7e30: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
7e40: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
7e50: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
7e60: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
7e70: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
7e80: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
7e90: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
7ea0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7eb0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
7ec0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
7ed0: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
7ee0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
7ef0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7f00: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
7f10: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
7f20: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
7f30: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
7f40: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
7f50: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
7f60: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
7f70: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
7f80: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
7f90: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
7fa0: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
7fb0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
7fc0: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
7fd0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
7fe0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
7ff0: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sInit = 1;.}../*
8000: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
8010: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
8020: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
8030: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
8040: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
8050: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
8060: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
8070: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
8080: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
8090: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
80a0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
80b0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
80c0: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
80d0: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
80e0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
80f0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
8100: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
8110: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
8120: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
8130: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
8140: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
8150: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
8160: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
8170: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
8180: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
8190: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
81a0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
81b0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
81c0: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
81d0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
81e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
81f0: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
8200: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
8210: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
8220: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8240: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
8250: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
8260: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
8270: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
8280: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
8290: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
82a0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
82b0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
82c0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
82d0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
82e0: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
82f0: 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65  *pPage;.  DbPage
8300: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
8310: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8320: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8330: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
8340: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
8350: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
8360: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
8370: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
8380: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
8390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
83a0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
83b0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
83c0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
83d0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
83e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
83f0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
8400: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
8410: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
8420: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
8430: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
8440: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
8450: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
8460: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
8470: 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   0;.  *ppPage = 
8480: 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  pPage;.  return 
8490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
84a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
84b0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
84c0: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
84d0: 73 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31  s.  Or return -1
84e0: 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   if.** there is 
84f0: 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  any kind of erro
8500: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
8510: 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
8520: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8530: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
8540: 6e 50 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71  nPage;.  rc = sq
8550: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
8560: 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
8570: 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  ge);.  return (r
8580: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61  c==SQLITE_OK?nPa
8590: 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge:-1);.}../*.**
85a0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
85b0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
85c0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
85d0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
85e0: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
85f0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
8600: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
8610: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
8620: 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61  BtreeGetPage() a
8630: 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nd sqlite3BtreeI
8640: 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  nitPage()..*/.st
8650: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
8660: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
8670: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
8680: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
8690: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
86a0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
86b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
86c0: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
86d0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
86e0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
86f0: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
8700: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d  er here */.  Mem
8710: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
8720: 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74    /* Parent of t
8730: 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  he page */.){.  
8740: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
8750: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8760: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
8770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
8780: 50 61 72 65 6e 74 20 7c 7c 20 70 50 61 72 65 6e  Parent || pParen
8790: 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  t->isInit );.  i
87a0: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
87b0: 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
87c0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
87d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
87e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
87f0: 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  ; .  }.  rc = sq
8800: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8810: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
8820: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8830: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8840: 20 20 20 20 69 66 28 20 28 2a 70 70 50 61 67 65      if( (*ppPage
8850: 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
8860: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8870: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
8880: 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  *ppPage, pParent
8890: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
88a0: 20 70 50 61 72 65 6e 74 20 26 26 20 28 28 2a 70   pParent && ((*p
88b0: 70 50 61 67 65 29 3d 3d 70 50 61 72 65 6e 74 20  pPage)==pParent 
88c0: 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
88d0: 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 29 20  arent!=pParent) 
88e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
88f0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 6e 64 69 63   condition indic
8900: 61 74 65 73 20 61 20 6c 6f 6f 70 20 69 6e 20 74  ates a loop in t
8910: 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
8920: 75 72 65 20 28 74 68 65 20 73 63 65 6e 61 72 69  ure (the scenari
8930: 6f 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65  o.      ** where
8940: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
8950: 74 69 6f 6e 20 68 61 73 20 63 61 75 73 65 64 20  tion has caused 
8960: 61 20 70 61 67 65 20 74 6f 20 62 65 20 61 20 64  a page to be a d
8970: 69 72 65 63 74 20 6f 72 0a 20 20 20 20 20 20 2a  irect or.      *
8980: 2a 20 69 6e 64 69 72 65 63 74 20 64 65 73 63 65  * indirect desce
8990: 6e 64 61 6e 74 20 6f 66 20 69 74 73 65 6c 66 29  ndant of itself)
89a0: 2e 0a 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20  ..      */ .    
89b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
89c0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
89d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
89e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
89f0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
8a00: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
8a10: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
8a20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
8a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
8a40: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
8a50: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
8a60: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
8a70: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
8a80: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
8a90: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
8aa0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
8ab0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8ac0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
8ad0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8ae0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
8af0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8b00: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
8b10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8b20: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
8b30: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
8b40: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
8b50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8b60: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
8b70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
8b80: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
8b90: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8ba0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8bb0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8bc0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
8bd0: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
8be0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
8bf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8c00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
8c10: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
8c20: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
8c30: 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  ge.** reaches ze
8c40: 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  ro.  We need to 
8c50: 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e  unref the pParen
8c60: 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  t pointer when t
8c70: 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a  hat.** happens..
8c80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8c90: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62  ageDestructor(Db
8ca0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
8cb0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8cc0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8cd0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
8ce0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
8cf0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  ;.  if( pPage ){
8d00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8d10: 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ge->isInit==0 ||
8d20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8d30: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8d40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 69 66  mutex) );.    if
8d50: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
8d60: 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
8d70: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
8d80: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
8d90: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
8da0: 6e 74 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e  nt->pBt==pPage->
8db0: 70 42 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  pBt );.      pPa
8dc0: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
8dd0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
8de0: 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  ge(pParent);.   
8df0: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73   }.    pPage->is
8e00: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Init = 0;.  }.}.
8e10: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
8e20: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
8e30: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
8e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
8e50: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
8e60: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
8e70: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
8e80: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
8e90: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
8ea0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
8eb0: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
8ec0: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
8ed0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8ee0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
8ef0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
8f00: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
8f10: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
8f20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8f30: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
8f40: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
8f50: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
8f60: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
8f70: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
8f80: 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  a, int pageSize)
8f90: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
8fa0: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ge;.  assert( (p
8fb0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
8fc0: 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  );.  pPage = (Me
8fd0: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
8fe0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
8ff0: 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ta);.  if( pPage
9000: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
9010: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9020: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9030: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9040: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
9050: 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  it = 0;.    sqli
9060: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
9070: 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70  (pPage, pPage->p
9080: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Parent);.  }.}..
9090: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
90a0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
90b0: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
90c0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
90d0: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
90e0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
90f0: 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53  g, int n){.  BtS
9100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
9110: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
9120: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
9130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9140: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9150: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
9160: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
9170: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
9180: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
9190: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
91a0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
91b0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
91c0: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
91d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
91e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
91f0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9200: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
9210: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
9220: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
9230: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
9240: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
9250: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
9260: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
9270: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
9280: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
9290: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
92a0: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
92b0: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
92c0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
92d0: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
92e0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
92f0: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
9300: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
9310: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
9320: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
9330: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
9340: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
9350: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9360: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
9370: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
9380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9390: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
93a0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
93b0: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
93c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
93d0: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
93e0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
93f0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
9400: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
9410: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
9420: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
9430: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
9440: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
9450: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
9460: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
9470: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
9480: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46  ;      /* The VF
9490: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
94a0: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
94b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
94c0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
94d0: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
94e0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
94f0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
9500: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
9510: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
9520: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9530: 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b  .  int nReserve;
9540: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9550: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
9560: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
9570: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
9580: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
9590: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
95a0: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
95b0: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
95c0: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
95d0: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
95e0: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
95f0: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
9600: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
9610: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
9620: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
9630: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
9640: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
9650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9660: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
9670: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
9680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9690: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
96a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
96b0: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
96c0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
96d0: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
96e0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
96f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
9700: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
9710: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
9720: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
9730: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9740: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9750: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
9760: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
9770: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
9780: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
9790: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
97a0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
97b0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
97c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
97d0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
97e0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
97f0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20  ->db = db;..#if 
9800: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9810: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9820: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
9830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
9840: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
9850: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
9860: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
9870: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
9880: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
9890: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
98a0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
98b0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
98c0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
98d0: 64 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d  db==0.   && (db-
98e0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
98f0: 56 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a  Vtab)==0.   && z
9900: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
9910: 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20  ename[0].  ){.  
9920: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
9930: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
9940: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
9950: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
9960: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
9970: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
9980: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
9990: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
99a0: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
99b0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
99c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
99d0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
99e0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
99f0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
9a00: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9a10: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
9a20: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
9a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9a40: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9a50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9a60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9a70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
9a80: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
9a90: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
9aa0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
9ab0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9ac0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
9ad0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
9ae0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9af0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
9b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9b10: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9b20: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9b30: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
9b40: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
9b50: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
9b60: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
9b70: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
9b80: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
9b90: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
9ba0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
9bb0: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
9bc0: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
9bd0: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
9bf0: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
9c00: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
9c10: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
9c20: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
9c30: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
9c40: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
9c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9c60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9c70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9c80: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
9c90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9ca0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
9cb0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
9cc0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9cd0: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
9ce0: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
9cf0: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
9d00: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
9d10: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
9d20: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
9d30: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
9d40: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
9d50: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
9d60: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
9d70: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
9d80: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
9d90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9da0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
9db0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
9dc0: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
9dd0: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
9de0: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
9df0: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
9e00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
9e10: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
9e20: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
9e30: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
9e40: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
9e50: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
9e60: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
9e70: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
9e80: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
9e90: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
9ea0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
9eb0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
9ec0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
9ed0: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
9ee0: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
9ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9f00: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
9f10: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
9f20: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f30: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
9f40: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
9f50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f60: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
9f70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9f80: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
9f90: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9fa0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
9fb0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
9fc0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
9fd0: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
9fe0: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
9ff0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a000: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a010: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
a020: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
a030: 42 74 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e  Bt->busyHdr.xFun
a040: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a050: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
a060: 72 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79  r;.    pBt->busy
a070: 48 64 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a  Hdr.pArg = pBt;.
a080: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a090: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
a0a0: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
a0b0: 69 6c 65 6e 61 6d 65 2c 20 70 61 67 65 44 65 73  ilename, pageDes
a0c0: 74 72 75 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  tructor,.       
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
a0f0: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b  lags, vfsFlags);
a100: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a110: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a120: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a130: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
a140: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
a150: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
a160: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
a170: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
a190: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
a1a0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ut;.    }.    sq
a1b0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
a1c0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
a1d0: 61 67 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79  ager, &pBt->busy
a1e0: 48 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  Hdr);.    p->pBt
a1f0: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73   = pBt;.  .    s
a200: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
a210: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
a220: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
a230: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
a240: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
a250: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
a260: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
a270: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
a280: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
a290: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
a2a0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
a2b0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
a2c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
a2d0: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
a2e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
a2f0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
a300: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
a310: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
a320: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
a330: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
a340: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
a350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
a360: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
a370: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
a380: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e  >pageSize);.#ifn
a390: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a3a0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
a3b0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
a3c0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
a3d0: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
a3e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
a3f0: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
a400: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
a410: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
a420: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
a430: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
a440: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
a450: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a460: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
a470: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
a480: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
a490: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
a4a0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
a4b0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
a4c0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
a4d0: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
a4e0: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
a4f0: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
a500: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
a510: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
a520: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
a530: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
a540: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
a550: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
a560: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
a570: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
a580: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
a590: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
a5a0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
a5b0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
a5c0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
a5d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
a5e0: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
a5f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
a600: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
a610: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
a620: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
a630: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
a640: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
a650: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
a660: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
a670: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
a680: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
a690: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
a6a0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
a6b0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
a6c0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
a6d0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
a6e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a6f0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
a700: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
a710: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
a720: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
a730: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
a740: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
a750: 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
a760: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
a770: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
a780: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
a790: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
a7a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a7b0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
a7c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a7d0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
a7e0: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
a7f0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
a800: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
a810: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
a820: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
a830: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
a840: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a850: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
a860: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
a870: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
a880: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
a890: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
a8a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a8b0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
a8c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
a8d0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
a8e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
a8f0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
a900: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
a910: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a920: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a930: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
a940: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
a950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a960: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a970: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
a980: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
a990: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
a9a0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
a9b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a9c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a9d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
a9e0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
a9f0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
aa00: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
aa10: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
aa20: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
aa30: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
aa40: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
aa50: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
aa60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
aa70: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
aa80: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
aa90: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
aaa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
aab0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
aac0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
aad0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
aae0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
aaf0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
ab00: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
ab10: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
ab20: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
ab30: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
ab40: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
ab50: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
ab60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
ab70: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
ab80: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
ab90: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
aba0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
abb0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
abc0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
abd0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
abe0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
abf0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
ac00: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
ac10: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
ac20: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
ac30: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
ac40: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
ac50: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
ac60: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
ac70: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
ac80: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
ac90: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
aca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
acb0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
acc0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
acd0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
ace0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
acf0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
ad00: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
ad10: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
ad20: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
ad30: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
ad40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ad50: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
ad60: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
ad70: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
ad80: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ad90: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
ada0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
adb0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
adc0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
add0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ade0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
adf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ae00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
ae10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
ae20: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
ae30: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
ae40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ae50: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
ae60: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
ae70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
ae80: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
ae90: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
aea0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
aeb0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
aec0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
aed0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
aee0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
aef0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
af00: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
af10: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
af20: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
af30: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
af40: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
af50: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
af60: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
af70: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
af80: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
af90: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
afa0: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
afb0: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
afc0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
afd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
afe0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
aff0: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
b000: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
b010: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
b020: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
b030: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
b040: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
b050: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
b060: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
b070: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
b080: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
b090: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
b0a0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
b0b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
b0c0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
b0d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b0e0: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
b0f0: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
b100: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
b110: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
b120: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
b130: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
b140: 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
b150: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
b160: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b170: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
b180: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
b190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
b1a0: 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
b1b0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b1c0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
b1d0: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
b1e0: 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
b1f0: 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
b200: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
b210: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
b220: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b230: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
b240: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
b250: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
b260: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
b270: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
b280: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
b290: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
b2a0: 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
b2b0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
b2c0: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
b2d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b2e0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
b2f0: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
b300: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
b310: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
b320: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
b330: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
b340: 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
b350: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
b360: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
b370: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
b380: 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
b390: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
b3a0: 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
b3b0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
b3c0: 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
b3d0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
b3e0: 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
b3f0: 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
b400: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
b410: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
b420: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
b430: 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
b440: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
b450: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
b460: 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
b470: 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
b480: 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
b490: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
b4a0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
b4b0: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
b4c0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
b4d0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
b4e0: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
b4f0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b500: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
b510: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
b520: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
b530: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
b540: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
b550: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
b570: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
b580: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b590: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
b5a0: 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d   p->db;.  pCur =
b5b0: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
b5c0: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
b5d0: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
b5e0: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
b5f0: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
b600: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
b610: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
b630: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
b640: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b650: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
b660: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
b670: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
b680: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
b690: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
b6a0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
b6b0: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
b6c0: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
b6d0: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
b6e0: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
b6f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b700: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
b710: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b720: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
b730: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
b740: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
b750: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
b760: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
b770: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
b780: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
b790: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
b7a0: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
b7b0: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
b7c0: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
b7d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
b7e0: 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
b7f0: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
b800: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
b810: 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
b820: 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
b830: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
b840: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
b850: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
b860: 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
b870: 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
b880: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
b890: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
b8a0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
b8b0: 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
b8c0: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
b8d0: 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
b8e0: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
b8f0: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
b900: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
b910: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
b920: 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
b930: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
b940: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
b950: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
b960: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
b970: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b980: 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63  e3_free(pBt->pSc
b990: 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
b9a0: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
b9b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b9c0: 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
b9d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b9e0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
b9f0: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
ba00: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
ba10: 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
ba20: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
ba30: 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
ba40: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
ba50: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
ba60: 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
ba70: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
ba80: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
ba90: 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
baa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bab0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
bac0: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
bad0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
bae0: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
baf0: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
bb00: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
bb10: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
bb20: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
bb30: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
bb40: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
bb50: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
bb60: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
bb70: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
bb80: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
bb90: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
bba0: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
bbb0: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
bbc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
bbd0: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
bbe0: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
bbf0: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
bc00: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
bc10: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
bc20: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
bc30: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
bc40: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
bc50: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
bc60: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
bc70: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
bc80: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
bc90: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
bca0: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
bcb0: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
bcc0: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
bcd0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
bce0: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
bcf0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
bd00: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
bd10: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
bd20: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
bd30: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
bd40: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
bd50: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
bd60: 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
bd70: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
bd80: 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
bd90: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
bda0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bdb0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
bdc0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bdd0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
bde0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
bdf0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
be00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
be10: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
be20: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
be30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
be40: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
be50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
be60: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
be70: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
be80: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
be90: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
bea0: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
beb0: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
bec0: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
bed0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
bee0: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
bef0: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
bf00: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
bf10: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
bf20: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
bf30: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
bf40: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
bf50: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
bf60: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
bf70: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
bf80: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
bf90: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
bfa0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
bfb0: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
bfc0: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
bfd0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
bfe0: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
bff0: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
c000: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
c010: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
c020: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c030: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
c040: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
c050: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
c060: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
c070: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
c080: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c090: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
c0a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c0b0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
c0c0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
c0d0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c0e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
c0f0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
c100: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
c110: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  , fullSync);.  s
c120: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c130: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
c140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
c150: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
c160: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
c170: 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
c180: 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
c190: 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
c1a0: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
c1b0: 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
c1c0: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
c1d0: 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
c1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
c1f0: 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
c200: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
c210: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
c220: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
c230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c240: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
c250: 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
c260: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c270: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
c280: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
c290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
c2a0: 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
c2b0: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
c2c0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c2d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c2e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c2f0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
c300: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
c310: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c320: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
c330: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
c340: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
c350: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
c360: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
c370: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
c380: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
c390: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
c3a0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
c3b0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
c3c0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
c3d0: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
c3e0: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
c3f0: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
c400: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
c410: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
c420: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
c430: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
c440: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
c450: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
c460: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
c470: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
c480: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
c490: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
c4a0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
c4b0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
c4c0: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
c4d0: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
c4e0: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
c4f0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
c500: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
c510: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
c520: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
c530: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c540: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
c550: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
c560: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
c570: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
c580: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
c590: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
c5a0: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
c5b0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
c5c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5d0: 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
c5e0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c5f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c600: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c610: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c620: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
c630: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c640: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c650: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
c660: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
c670: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
c680: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c690: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c6a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
c6b0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
c6c0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
c6d0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
c6e0: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
c6f0: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
c700: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
c710: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
c720: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
c730: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
c740: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
c750: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
c760: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
c770: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
c780: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
c790: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
c7a0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
c7b0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
c7c0: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
c7d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
c7e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c7f0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69  nReserve;.  sqli
c800: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c810: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c830: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
c840: 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
c850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c860: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
c870: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
c880: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
c890: 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ze;.}.int sqlite
c8a0: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
c8b0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
c8c0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
c8d0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
c8e0: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
c8f0: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
c900: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
c910: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c920: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
c940: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
c950: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
c960: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
c970: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
c980: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
c990: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
c9a0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
c9b0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
c9c0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
c9d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
c9e0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
c9f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ca00: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
ca10: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
ca20: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
ca30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ca40: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
ca50: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
ca60: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
ca70: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
ca80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ca90: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
caa0: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
cab0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cac0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
cad0: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
cae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
caf0: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
cb00: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
cb10: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
cb20: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
cb30: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
cb40: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
cb50: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
cb60: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
cb70: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
cb80: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
cb90: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
cba0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
cbb0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
cbc0: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
cbd0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
cbe0: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
cbf0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
cc00: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
cc10: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
cc20: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
cc30: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
cc40: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cc50: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
cc60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cc70: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
cc80: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
cc90: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
cca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ccb0: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
ccc0: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20  Vacuum?1:0);..  
ccd0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
cce0: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
ccf0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
cd00: 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56  & av!=pBt->autoV
cd10: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
cd20: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
cd30: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
cd40: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
cd50: 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  = av;.  }.  sqli
cd60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
cd70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
cd80: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
cd90: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
cda0: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
cdb0: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
cdc0: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
cdd0: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
cde0: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
cdf0: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
ce00: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
ce10: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
ce20: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
ce30: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ce40: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
ce50: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
ce60: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
ce70: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
ce80: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
ce90: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
cea0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
ceb0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
cec0: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
ced0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
cee0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
cef0: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
cf00: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
cf10: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
cf20: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
cf30: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
cf40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
cf50: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
cf60: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
cf70: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
cf80: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
cf90: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
cfa0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
cfb0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
cfc0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
cfd0: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
cfe0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
cff0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
d000: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
d010: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
d020: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
d030: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
d040: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
d050: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
d060: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
d070: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
d080: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
d090: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
d0a0: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
d0b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
d0c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
d0d0: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
d0e0: 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
d0f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d100: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d110: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
d120: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
d130: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d140: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d150: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
d160: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
d170: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d180: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
d190: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
d1a0: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
d1b0: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
d1c0: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
d1d0: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
d1e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
d1f0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
d200: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
d210: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
d220: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
d230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d240: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d250: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73  t_failed;.  }els
d260: 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b  e if( nPage>0 ){
d270: 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
d280: 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
d290: 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
d2a0: 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
d2b0: 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
d2c0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
d2d0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
d2e0: 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
d2f0: 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
d300: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d310: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d320: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
d330: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
d340: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
d350: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
d360: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
d370: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d380: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d390: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
d3a0: 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
d3b0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
d3c0: 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
d3d0: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
d3e0: 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
d3f0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
d400: 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
d410: 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
d420: 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
d430: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
d440: 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
d450: 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
d460: 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
d470: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
d480: 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
d490: 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
d4a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d4b0: 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
d4c0: 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
d4d0: 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
d4e0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
d4f0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
d500: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
d510: 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
d520: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
d530: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
d540: 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
d550: 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
d560: 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
d570: 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
d580: 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
d590: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
d5a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
d5b0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d5c0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
d5d0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
d5e0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
d5f0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
d600: 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
d610: 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
d620: 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
d630: 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
d640: 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
d650: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
d660: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
d670: 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
d680: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
d690: 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
d6a0: 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
d6b0: 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
d6c0: 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
d6d0: 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
d6e0: 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
d6f0: 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
d700: 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
d710: 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
d720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d730: 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
d740: 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
d750: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
d760: 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
d770: 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
d780: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d790: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
d7a0: 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
d7b0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
d7c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
d7d0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
d7e0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
d7f0: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
d800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d810: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
d820: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
d830: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
d840: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d850: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
d860: 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
d870: 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  500 ){.      got
d880: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d890: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
d8a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
d8b0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
d8c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
d8d0: 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
d8e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d8f0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
d900: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
d910: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
d920: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
d930: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
d940: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
d950: 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
d960: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
d970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
d980: 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
d990: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
d9a0: 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
d9b0: 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
d9c0: 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
d9d0: 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
d9e0: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
d9f0: 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
da00: 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
da10: 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
da20: 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
da30: 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
da40: 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
da50: 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
da60: 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
da70: 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
da80: 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
da90: 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
daa0: 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
dab0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
dac0: 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
dad0: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
dae0: 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
daf0: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
db00: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
db10: 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
db20: 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
db30: 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
db40: 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
db50: 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
db60: 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
db70: 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
db80: 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
db90: 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
dba0: 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
dbb0: 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
dbc0: 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
dbd0: 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
dbe0: 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
dbf0: 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
dc00: 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
dc10: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
dc20: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
dc30: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
dc40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
dc50: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
dc60: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
dc70: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
dc80: 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
dc90: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
dca0: 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
dcb0: 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
dcc0: 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
dcd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dce0: 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
dcf0: 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
dd00: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
dd10: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
dd20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
dd30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
dd40: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
dd50: 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
dd60: 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
dd70: 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
dd80: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
dd90: 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
dda0: 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
ddb0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
ddc0: 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
ddd0: 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
dde0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ddf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
de00: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
de10: 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
de20: 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
de30: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
de40: 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
de50: 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
de60: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
de70: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
de80: 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
de90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
dea0: 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
deb0: 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
dec0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ded0: 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
dee0: 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
def0: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
df00: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
df10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
df20: 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
df30: 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
df40: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
df50: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
df60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
df70: 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
df80: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
df90: 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
dfa0: 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
dfb0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
dfc0: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
dfd0: 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
dfe0: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
dff0: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
e000: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
e010: 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
e020: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
e030: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
e040: 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
e050: 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
e060: 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
e070: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
e080: 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
e090: 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
e0a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
e0b0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
e0c0: 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
e0d0: 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
e0e0: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
e0f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
e100: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
e110: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
e120: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
e130: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e140: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
e150: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
e160: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
e170: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
e180: 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
e190: 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
e1a0: 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
e1b0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
e1c0: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
e1d0: 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
e1e0: 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
e1f0: 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20  1->aData );.#if 
e200: 30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  0.      if( pBt-
e210: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d  >pPage1->aData==
e220: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  0 ){.        Mem
e230: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42  Page *pPage = pB
e240: 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20  t->pPage1;.     
e250: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
e260: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
e270: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
e280: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
e290: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
e2a0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
e2b0: 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  pgno = 1;.      
e2c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
e2d0: 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
e2e0: 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
e2f0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
e300: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   0;.    pBt->inS
e310: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 0;.  }.}..
e320: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
e330: 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ew database by i
e340: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
e350: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
e360: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
e370: 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
e380: 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
e390: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
e3a0: 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
e3b0: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
e3c0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
e3d0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
e3e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e3f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
e400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e410: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
e420: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
e430: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e440: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e  ITE_OK || nPage>
e450: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
e460: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  rc;.  }.  pP1 = 
e470: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
e480: 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
e490: 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
e4a0: 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
e4b0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
e4c0: 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
e4d0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e4e0: 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
e4f0: 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
e500: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
e510: 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
e520: 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
e530: 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
e540: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
e550: 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
e560: 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
e570: 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
e580: 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d   1;.  data[20] =
e590: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
e5a0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
e5b0: 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
e5c0: 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
e5d0: 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
e5e0: 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
e5f0: 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
e600: 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
e610: 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
e620: 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
e630: 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
e640: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
e650: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
e660: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e670: 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
e680: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
e690: 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
e6a0: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
e6b0: 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
e6c0: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
e6d0: 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
e6e0: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
e6f0: 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
e700: 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
e710: 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
e720: 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
e730: 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
e740: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e750: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
e760: 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
e770: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
e780: 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
e790: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
e7a0: 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
e7b0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
e7c0: 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
e7d0: 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
e7e0: 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
e7f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e800: 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
e810: 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
e820: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
e830: 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
e840: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
e850: 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
e860: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
e870: 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
e880: 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
e890: 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
e8a0: 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
e8b0: 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
e8c0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
e8d0: 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
e8e0: 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
e8f0: 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
e900: 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
e910: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
e920: 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
e930: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
e940: 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
e950: 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
e960: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
e970: 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
e980: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e990: 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
e9a0: 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
e9b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
e9c0: 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
e9d0: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
e9e0: 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
e9f0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ea00: 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
ea10: 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
ea20: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
ea30: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
ea40: 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
ea50: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
ea60: 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
ea70: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ea80: 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
ea90: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
eaa0: 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
eab0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
eac0: 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
ead0: 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
eae0: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
eaf0: 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
eb00: 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
eb10: 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
eb20: 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
eb30: 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
eb40: 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
eb50: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
eb60: 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
eb70: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
eb80: 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
eb90: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
eba0: 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
ebb0: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
ebc0: 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
ebd0: 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
ebe0: 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
ebf0: 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
ec00: 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
ec10: 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
ec20: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
ec30: 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
ec40: 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
ec50: 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
ec60: 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
ec70: 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
ec80: 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
ec90: 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
eca0: 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
ecb0: 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
ecc0: 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
ecd0: 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
ece0: 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
ecf0: 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
ed00: 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
ed10: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
ed20: 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
ed30: 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
ed40: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
ed50: 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
ed60: 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
ed70: 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
ed80: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
ed90: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
eda0: 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
edb0: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
edc0: 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
edd0: 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
ede0: 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
edf0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ee00: 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
ee10: 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
ee20: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
ee30: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
ee40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ee50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
ee60: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
ee70: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
ee80: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
ee90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
eea0: 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
eeb0: 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
eec0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
eed0: 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
eee0: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
eef0: 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
ef00: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
ef10: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
ef20: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
ef30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
ef40: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
ef50: 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
ef60: 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
ef70: 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
ef80: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
ef90: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
efa0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
efb0: 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
efc0: 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
efd0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
efe0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
eff0: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
f000: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
f010: 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
f020: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
f030: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
f040: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
f050: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
f060: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
f070: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
f080: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
f090: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
f0a0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
f0b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
f0c0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
f0d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f0e0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
f0f0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f100: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
f110: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
f120: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
f130: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
f140: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
f150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f160: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f170: 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
f180: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
f190: 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
f1a0: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
f1b0: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
f1c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
f1d0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
f1e0: 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=p ){.        r
f1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f200: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 72  .        goto tr
f210: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20  ans_begun;.     
f220: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f230: 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  dif..  do {.    
f240: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
f250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  =0 ){.      do{.
f260: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63          rc = loc
f270: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
f280: 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e     }while( pBt->
f290: 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d  pPage1==0 && rc=
f2a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f2b0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
f2c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
f2d0: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
f2e0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
f2f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f300: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f310: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f320: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f330: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
f340: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
f350: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
f360: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f380: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
f390: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
f3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f3b0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
f3c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f3d0: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
f3e0: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
f3f0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
f400: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
f410: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
f420: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
f430: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
f440: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
f450: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
f460: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
f470: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
f480: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c  BusyHandler(pBt,
f490: 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63   0) );..  if( rc
f4a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f4b0: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
f4c0: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
f4d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
f4e0: 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
f4f0: 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
f500: 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
f510: 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
f520: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
f530: 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
f540: 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
f550: 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
f560: 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
f570: 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
f580: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f590: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
f5a0: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
f5b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
f5c0: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b  t->pExclusive );
f5d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63  .      pBt->pExc
f5e0: 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20  lusive = p;.    
f5f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
f600: 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74  rans_begun:.  bt
f610: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
f620: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
f630: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
f640: 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
f650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f660: 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
f670: 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
f680: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
f690: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
f6a0: 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
f6b0: 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
f6c0: 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
f6d0: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
f6e0: 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
f6f0: 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
f700: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
f710: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
f720: 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
f730: 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
f740: 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
f750: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
f760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f780: 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
f790: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
f7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f7c0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
f7d0: 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
f7e0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
f810: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
f820: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
f830: 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  t;.  int isInitO
f840: 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
f850: 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
f860: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
f870: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f880: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
f890: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
f8a0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
f8b0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
f8c0: 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50  pPage, pPage->pP
f8d0: 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
f8e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f8f0: 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
f900: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
f910: 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
f920: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
f930: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
f940: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
f950: 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
f960: 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72  Page, i);..    r
f970: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
f980: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
f990: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
f9a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f9b0: 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
f9c0: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
f9d0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
f9e0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f9f0: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
fa00: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
fa10: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ell);.      rc =
fa20: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
fa30: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
fa40: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
fa50: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
fa60: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
fa70: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
fa80: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
fa90: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
faa0: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
fab0: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
fac0: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
fad0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
fae0: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
faf0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
fb00: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
fb10: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
fb20: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
fb30: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
fb40: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fb50: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
fb60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fb70: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
fb80: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
fb90: 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
fba0: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
fbb0: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
fbc0: 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
fbd0: 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
fbe0: 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
fbf0: 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
fc00: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
fc10: 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
fc20: 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
fc30: 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
fc40: 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
fc50: 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
fc60: 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
fc70: 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
fc80: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
fc90: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
fca0: 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
fcb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fcc0: 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
fcd0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
fce0: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
fcf0: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
fd00: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
fd10: 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
fd20: 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
fd30: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
fd40: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
fd50: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
fd60: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
fd70: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
fd80: 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
fd90: 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
fda0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
fdb0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
fdd0: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
fde0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
fdf0: 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
fe00: 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
fe10: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
fe20: 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
fe30: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
fe40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
fe50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
fe60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fe70: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
fe80: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
fe90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
fea0: 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
feb0: 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
fec0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
fed0: 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
fee0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
fef0: 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
ff00: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
ff10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ff20: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ff30: 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
ff40: 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
ff50: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
ff60: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
ff70: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
ff80: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
ff90: 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
ffa0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ffb0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
ffc0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
ffd0: 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
ffe0: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
fff0: 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
10000 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
10010 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
10020 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
10030 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
10040 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
10050 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
10060 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
10070 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
10080 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
10090 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
100a0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
100b0 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
100c0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
100d0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
100e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
100f0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
10100 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
10110 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
10120 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
10130 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
10140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10150 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
10160 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
10170 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
10180 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
10190 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
101a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
101b0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
101c0 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
101d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
101e0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
101f0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
10200 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
10210 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
10220 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
10230 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10240 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10250 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
10260 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
10270 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
10280 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
10290 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
102a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
102b0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
102c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
102d0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
102e0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
102f0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
10300 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
10310 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
10320 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
10330 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
10340 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
10350 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10360 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
10370 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
10390 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
103a0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
103b0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
103c0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
103d0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
103e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
103f0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
10400 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
10410 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
10420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10430 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
10440 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
10450 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
10460 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
10470 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
10480 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
10490 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
104a0 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d  sCommit.){.  Mem
104b0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
104c0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
104d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
104e0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
104f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
10500 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
10510 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
10520 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
10530 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
10540 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
10550 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
10560 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
10570 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
10580 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
10590 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
105a0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
105b0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
105c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
105d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
105e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
105f0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
10600 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
10610 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
10620 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
10630 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
10640 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
10650 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
10660 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
10670 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
10680 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
10690 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
106a0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
106b0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
106c0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
106d0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
106e0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
106f0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
10700 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
10710 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10730 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
10740 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
10750 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
10760 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
10770 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
10780 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
10790 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
107a0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
107b0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
107c0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
107d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
107e0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
107f0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
10800 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
10810 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
10820 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
10830 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
10840 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
10850 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
10860 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
10870 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
10880 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
10890 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
108a0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
108b0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
108c0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
108d0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
108e0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
108f0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
10900 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
10910 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
10920 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
10930 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
10940 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
10950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10960 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10970 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
10980 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
10990 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
109a0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
109b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
109c0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
109d0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
109e0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
109f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
10a00 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
10a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
10a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10a40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
10a50 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
10a60 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
10a70 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
10a80 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
10a90 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
10aa0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
10ab0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
10ac0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
10ad0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
10ae0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
10af0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
10b00 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
10b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10b20 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10b30 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
10b40 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
10b50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10b60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10b70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
10b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10b90 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
10ba0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
10bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10bc0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
10bd0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
10be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10bf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10c00 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
10c10 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
10c20 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
10c30 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
10c40 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
10c50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10c70 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
10c80 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
10c90 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
10ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
10cb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
10cc0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
10cd0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
10ce0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
10cf0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
10d00 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10d10 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
10d20 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
10d30 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
10d40 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
10d50 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
10d60 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
10d70 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
10d80 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
10d90 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
10da0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
10db0 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
10dc0 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
10dd0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
10de0 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
10df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10e00 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
10e10 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
10e20 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
10e30 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
10e40 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
10e50 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
10e60 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
10e70 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
10e80 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
10e90 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
10ea0 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
10eb0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
10ec0 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ro, the implemen
10ed0 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  tation assumes.*
10ee0 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
10ef0 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
10f00 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
10f10 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
10f20 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
10f30 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
10f40 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
10f50 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
10f60 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
10f70 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
10f80 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
10f90 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
10fa0 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a  is complete..*/.
10fb0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
10fc0 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
10fd0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
10fe0 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73  in){.  Pgno iLas
10ff0 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  tPg;            
11000 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e   /* Last page in
11010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
11020 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
11030 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
11040 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
11050 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
11060 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
11070 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11080 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11090 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67  ex) );.  iLastPg
110a0 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
110b0 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30    if( iLastPg==0
110c0 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20   ){.    iLastPg 
110d0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
110e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
110f0 20 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41   }..  if( !PTRMA
11100 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
11110 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
11120 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
11130 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11140 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20   int rc;.    u8 
11150 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
11160 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
11170 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
11180 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11190 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
111a0 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
111b0 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73  =0 || nFin==iLas
111c0 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74  tPg ){.      ret
111d0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
111e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
111f0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
11200 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
11210 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
11220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
11240 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
11250 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
11260 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
11270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11280 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11290 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
112a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
112b0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
112c0 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
112d0 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
112e0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
112f0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
11300 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
11310 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
11320 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
11330 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
11340 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
11350 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
11360 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
11370 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
11380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
11390 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
113a0 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
113b0 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
113c0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
113d0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
113e0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
113f0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
11400 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
11410 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
11420 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
11430 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
11440 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
11450 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
11460 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11480 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11490 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
114a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
114b0 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
114c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
114d0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
114e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
114f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
11500 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
11510 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11520 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
11530 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
11540 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
11550 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
11560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
11570 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
11580 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
11590 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
115a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
115b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
115c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
115d0 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
115e0 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
115f0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
11600 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
11610 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
11620 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
11630 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
11640 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
11650 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
11660 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
11670 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
11680 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
11690 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
116a0 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
116b0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
116c0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
116d0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
116e0 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
116f0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
11700 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
11710 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
11720 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
11730 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
11740 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
11750 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
11760 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
11770 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
11780 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
117a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
117b0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
117c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
117d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
117e0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
117f0 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
11800 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
11810 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
11820 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
11830 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
11840 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
11850 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11860 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
11870 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
11880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11890 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
118a0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
118b0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
118c0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
118d0 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
118e0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
118f0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
11900 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11920 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11940 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  ..  pBt->nTrunc 
11950 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20  = iLastPg - 1;. 
11960 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72   while( pBt->nTr
11970 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  unc==PENDING_BYT
11980 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
11990 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
119a0 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a  pBt->nTrunc) ){.
119b0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d      pBt->nTrunc-
119c0 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
119d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
119e0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
119f0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
11a00 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
11a10 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
11a20 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
11a30 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
11a40 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
11a50 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
11a60 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
11a70 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
11a80 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
11a90 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
11aa0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
11ab0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
11ac0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
11ad0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
11ae0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
11af0 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51  r occured,.** SQ
11b00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11b10 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
11b20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
11b30 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
11b40 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
11b50 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
11b60 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
11b70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11b80 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
11b90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
11ba0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
11bb0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
11bc0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11bd0 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
11be0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
11bf0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
11c00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
11c10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11c20 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
11c30 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
11c40 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
11c50 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
11c60 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
11c70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
11c80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11c90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11cb0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
11cc0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
11cd0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
11ce0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
11cf0 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
11d00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
11d10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
11d20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
11d30 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
11d40 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
11d50 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
11d60 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
11d70 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
11d80 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
11d90 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
11da0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
11db0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
11dc0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
11dd0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
11de0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
11df0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
11e00 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
11e10 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
11e20 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
11e30 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
11e40 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  *pnTrunc){.  int
11e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11e60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
11e70 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
11e80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11e90 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
11ea0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
11eb0 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66  (pPager);.#endif
11ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11ed0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11ee0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11ef0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
11f00 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
11f10 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
11f20 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
11f30 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
11f40 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
11f50 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Fin = 0;..    if
11f60 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  ( pBt->nTrunc==0
11f70 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
11f80 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Free;.      Pgno
11f90 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
11fa0 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
11fb0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
11fc0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 69 67 20        int nOrig 
11fd0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
11fe0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a  (pBt->pPager);..
11ff0 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50        if( PTRMAP
12000 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
12010 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ig) ){.        r
12020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
12040 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72   }.      if( nOr
12050 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
12060 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
12070 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20        nOrig--;. 
12080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
12090 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
120a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
120b0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50  a[36]);.      nP
120c0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
120d0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
120e0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70  NO(pBt, nOrig)+p
120f0 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b  gsz/5)/(pgsz/5);
12100 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  .      nFin = nO
12110 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
12120 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28  trmap;.      if(
12130 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
12140 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
12150 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42   nFin<=PENDING_B
12160 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
12170 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  .        nFin--;
12180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
12190 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
121a0 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
121b0 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
121c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
121d0 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d  {.        nFin--
121e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
121f0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
12200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12210 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
12220 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
12230 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
12250 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12260 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d  (nFin==0 || pBt-
12270 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46  >nTrunc==0 || nF
12280 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29  in<=pBt->nTrunc)
12290 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
122a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
122b0 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26  ( pBt->nTrunc &&
122c0 20 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20   nFin ){.       
122d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
122e0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
122f0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
12300 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12310 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
12320 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
12330 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
12340 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12350 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
12360 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d     pBt->nTrunc =
12370 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
12380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
12390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
123a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
123b0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
123c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
123d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
123e0 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63   ){.    *pnTrunc
123f0 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
12400 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
12410 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
12420 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
12430 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
12440 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
12450 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  n rc;.}..#endif.
12460 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12470 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
12480 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
12490 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
124a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
124b0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
124c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
124d0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
124e0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
124f0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
12500 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
12510 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
12520 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
12530 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
12540 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12550 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
12560 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
12570 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
12580 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
12590 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
125a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
125b0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
125c0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
125d0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
125e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
125f0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
12600 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
12610 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
12620 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
12630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12640 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
12650 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
12660 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
12670 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
12680 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
12690 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
126a0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
126b0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
126c0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
126d0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
126e0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
126f0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
12700 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74  eeCommit() for t
12710 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
12720 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
12730 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
12740 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
12750 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
12760 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
12770 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
12780 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
12790 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
127a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
127b0 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
127c0 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
127d0 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
127e0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
127f0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
12800 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
12810 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
12820 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
12830 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
12840 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
12850 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12860 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
12870 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
12880 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
12890 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
128a0 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
128b0 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
128c0 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
128d0 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
128e0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
128f0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
12900 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
12910 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
12920 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
12930 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
12940 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
12950 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
12960 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
12970 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
12980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
12990 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
129a0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
129b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
129c0 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
129d0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
129e0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
129f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12a00 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12a10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
12a20 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
12a30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
12a40 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30   Pgno nTrunc = 0
12a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
12a60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
12a70 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
12a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12a90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12aa0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
12ab0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
12ac0 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
12ad0 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72  Commit(pBt, &nTr
12ae0 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28  unc); .      if(
12af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12b00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12b10 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12b20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12b30 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
12b40 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
12b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
12b60 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
12b70 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
12b80 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a 20 20  , nTrunc, 0);.  
12b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12ba0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
12bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12bc0 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
12bd0 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
12be0 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
12bf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12c00 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
12c10 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
12c20 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
12c30 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
12c40 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
12c50 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
12c60 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
12c70 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
12c80 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  d.** prior to ca
12c90 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
12ca0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
12cb0 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74  BtreeSync() rout
12cc0 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74  ine did.** all t
12cd0 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
12ce0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
12cf0 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
12d00 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
12d10 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
12d20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
12d30 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
12d40 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
12d50 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
12d60 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
12d70 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65   or truncate the
12d80 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12d90 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73  l.** (which caus
12da0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
12db0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
12dc0 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  d drop locks..**
12dd0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
12de0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
12df0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12e00 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
12e10 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
12e20 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
12e30 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
12e40 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
12e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12e60 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
12e70 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
12e80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12e90 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
12ea0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12eb0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
12ec0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
12ed0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
12ee0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
12ef0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12f00 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
12f10 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
12f20 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
12f30 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
12f40 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
12f50 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
12f60 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
12f70 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
12f80 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
12f90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
12fa0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
12fb0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
12fc0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
12fd0 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
12fe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12ff0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
13000 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
13010 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13030 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13040 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
13050 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13060 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
13070 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
13080 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  D;.    pBt->inSt
13090 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e  mt = 0;.  }.  un
130a0 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
130b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
130c0 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69  andle has any ki
130d0 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
130e0 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
130f0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
13100 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  n.  ** count of 
13110 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
13120 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
13130 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68  tion count reach
13140 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74  es 0, set.  ** t
13150 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
13160 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
13170 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
13180 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65  Unused() call be
13190 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e  low.  ** will un
131a0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
131b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
131c0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
131d0 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  E ){.    pBt->nT
131e0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
131f0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
13200 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
13210 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13220 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
13230 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
13240 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e    /* Set the han
13250 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61  dles current tra
13260 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
13270 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
13280 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
13290 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
132a0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
132b0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
132c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
132d0 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   */.  p->inTrans
132e0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
132f0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13300 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
13310 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13320 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13330 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13340 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13350 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
13360 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
13370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13380 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
13390 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
133a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
133b0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
133c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
133d0 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
133e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
133f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
13400 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13410 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
13420 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
13430 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13440 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
13450 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
13460 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
13470 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
13480 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
13490 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
134a0 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
134b0 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
134c0 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
134d0 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
134e0 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
134f0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
13500 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
13510 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
13520 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  , a write-cursor
13530 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
13540 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
13550 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20  e of writing to 
13560 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68  the databse.  Th
13570 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  at means the cur
13580 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69  sor was.** origi
13590 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  nally opened for
135a0 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65   writing and the
135b0 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
135c0 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62  be disabled.** b
135d0 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61  y having its sta
135e0 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55  te changed to CU
135f0 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73  RSOR_FAULT..*/.s
13600 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
13610 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
13620 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
13630 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
13640 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
13650 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
13660 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
13670 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
13680 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
13690 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  g && pCur->eStat
136a0 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
136b0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
136c0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
136d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
136e0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
136f0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
13700 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
13710 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
13720 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
13730 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
13740 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
13750 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
13760 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
13770 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
13780 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
13790 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
137a0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
137b0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
137c0 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
137d0 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
137e0 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
137f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13800 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
13810 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
13820 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
13830 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
13840 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
13850 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
13860 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
13870 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
13880 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
13890 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
138a0 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
138b0 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
138c0 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
138d0 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
138e0 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
138f0 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
13900 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
13910 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
13920 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
13930 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
13940 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
13950 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
13960 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
13970 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
13980 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
13990 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
139a0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72  r(pBtree);.  for
139b0 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
139c0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
139d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6c 65  >pNext){.    cle
139e0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
139f0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
13a00 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
13a10 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d  T;.    p->skip =
13a20 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20   errCode;.  }.  
13a30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13a40 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
13a50 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
13a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13a70 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
13a80 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
13a90 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
13aa0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
13ab0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
13ac0 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
13ad0 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
13ae0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13af0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
13b00 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
13b10 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
13b20 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
13b30 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
13b40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13b50 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
13b60 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
13b70 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
13b80 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
13b90 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
13ba0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13bb0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
13bc0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
13bd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13be0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
13bf0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
13c00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13c10 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
13c20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61  p->db;.  rc = sa
13c30 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
13c40 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
13c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13c60 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
13c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13c80 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
13c90 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
13ca0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
13cb0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
13cc0 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
13cd0 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
13ce0 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
13cf0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
13d00 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
13d10 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
13d20 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
13d30 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
13d40 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
13d50 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
13d60 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
13d70 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
13d80 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
13d90 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
13da0 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
13db0 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
13dc0 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
13dd0 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
13de0 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
13df0 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
13e00 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
13e10 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
13e20 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
13e30 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
13e40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
13e50 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
13e60 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
13e70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
13e80 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13e90 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
13ea0 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
13eb0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
13ec0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
13ed0 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
13ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13ef0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
13f00 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
13f10 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
13f20 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
13f30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
13f40 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
13f50 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
13f60 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
13f70 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
13f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13f90 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
13fa0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
13fb0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
13fc0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
13fd0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
13fe0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
13ff0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14000 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
14010 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
14020 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
14030 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
14040 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
14050 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14060 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
14070 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
14080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14090 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
140a0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
140b0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
140c0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
140d0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
140e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
140f0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
14100 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
14110 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
14120 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14130 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
14140 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
14150 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
14160 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
14170 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
14180 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14190 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
141a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
141b0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
141c0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
141d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
141e0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
141f0 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14200 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14210 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14220 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
14240 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
14250 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
14260 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
14270 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
14280 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
14290 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
142a0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
142b0 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
142c0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
142d0 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
142e0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
142f0 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
14300 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
14310 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
14320 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
14330 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
14340 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
14350 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
14360 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
14370 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
14380 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
14390 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
143a0 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
143b0 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
143c0 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
143d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
143e0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
143f0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
14400 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
14410 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
14420 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
14430 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
14440 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
14450 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
14460 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
14470 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
14480 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
14490 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
144a0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
144b0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
144c0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
144d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
144e0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
144f0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
14500 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14520 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
14530 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14540 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14550 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
14560 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14570 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14580 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ->db;.  if( (p->
14590 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
145a0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
145b0 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Stmt ){.    rc =
145c0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
145d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
145e0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
145f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14600 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
14610 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
14620 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20  WRITE );.    rc 
14630 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
14640 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
14650 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
14660 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
14670 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
14680 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 1;.  }.  sql
14690 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
146a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
146b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
146c0 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75   the statment su
146d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72  btransaction cur
146e0 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
146f0 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ss.  If no.** su
14700 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
14710 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20  active, this is 
14720 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
14730 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14740 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  itStmt(Btree *p)
14750 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
14760 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14770 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
14780 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14790 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
147a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
147b0 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
147c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
147d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
147e0 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61  tCommit(pBt->pPa
147f0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
14800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14810 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e  K;.  }.  pBt->in
14820 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Stmt = 0;.  sqli
14830 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14840 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14850 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
14860 20 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74   the active stat
14870 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
14880 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62  tion.  If no sub
14890 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
148a0 73 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f  s active this ro
148b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
148c0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  ..**.** All curs
148d0 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
148e0 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
148f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
14900 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73  attempt.** to us
14910 65 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  e a cursor that 
14920 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
14930 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
14940 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77  s operation.** w
14950 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
14960 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
14970 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
14980 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ackStmt(Btree *p
14990 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
149a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
149b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
149c0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
149d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
149e0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
149f0 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
14a00 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
14a10 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
14a20 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
14a30 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
14a40 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
14a50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
14a60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14a70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14a80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
14a90 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
14aa0 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
14ab0 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
14ac0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
14ad0 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
14ae0 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
14af0 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
14b00 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
14b10 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
14b20 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
14b30 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14b40 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
14b50 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
14b60 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
14b70 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14b80 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
14b90 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
14ba0 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
14bb0 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
14bc0 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
14bd0 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
14be0 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
14bf0 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
14c00 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
14c10 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
14c20 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
14c30 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
14c40 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
14c50 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
14c60 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
14c70 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
14c80 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
14c90 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
14ca0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
14cb0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
14cc0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
14cd0 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
14ce0 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
14cf0 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
14d00 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
14d10 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
14d20 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
14d30 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
14d40 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
14d50 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
14d60 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
14d70 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
14d80 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
14d90 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
14da0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
14db0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
14dc0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
14dd0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
14de0 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
14df0 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
14e00 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
14e10 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
14e20 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
14e30 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
14e40 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
14e50 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
14e60 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
14e70 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
14e80 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
14e90 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
14ea0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
14eb0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
14ec0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
14ed0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
14ee0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
14f10 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f40 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
14f50 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
14f60 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
14f90 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
14fa0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
14fb0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fd0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
14fe0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
14ff0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
15000 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15020 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
15030 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ursor */.){.  in
15040 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
15050 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15060 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15070 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
15080 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 77 72  x(p) );.  if( wr
15090 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
150a0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
150b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
150c0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
150d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
150e0 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
150f0 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Table, 0, 0) ){.
15100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15110 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
15120 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
15130 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
15140 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
15150 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
15160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15180 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15190 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
151a0 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
151b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
151c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
151d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
151e0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
151f0 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28  no)iTable;.  if(
15200 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61   iTable==1 && pa
15210 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
15220 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
15230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15240 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
15250 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
15260 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
15270 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
15280 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
15290 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
152a0 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
152b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
152c0 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
152d0 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
152e0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
152f0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
15300 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
15310 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
15320 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
15330 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
15340 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
15350 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
15360 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
15370 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
15380 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
15390 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
153a0 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
153b0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
153c0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
153d0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
153e0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
153f0 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
15400 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
15410 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
15420 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
15430 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
15440 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
15450 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
15460 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
15470 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
15480 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
15490 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D;..  return SQL
154a0 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
154b0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
154c0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
154d0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
154e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
154f0 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
15500 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15510 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
15520 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15550 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
15560 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15590 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
155a0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
155b0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
155e0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
155f0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
15600 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
15610 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
15620 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
15630 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
15640 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
15650 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
15680 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
15690 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
156a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
156b0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
156c0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
156d0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
156e0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
156f0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
15700 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15710 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15720 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15730 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
15740 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20  ize(){.  return 
15750 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
15760 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ;.}..../*.** Clo
15770 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
15780 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
15790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
157a0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
157b0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
157c0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
157d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
157e0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
157f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15800 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
15810 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
15820 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
15830 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
15840 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
15850 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
15860 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
15870 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72    pBt->db = pBtr
15880 65 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61  ee->db;.    clea
15890 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
158a0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
158b0 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
158c0 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
158d0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
158e0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
158f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15900 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15910 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15920 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
15930 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
15940 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
15950 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
15960 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
15970 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
15980 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15990 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
159a0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
159b0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
159c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
159d0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
159e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
159f0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
15a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
15a20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
15a30 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
15a40 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
15a50 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
15a60 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
15a70 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
15a80 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
15a90 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
15aa0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
15ab0 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
15ac0 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
15ad0 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
15ae0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
15af0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
15b00 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ) );.  memcpy(pT
15b10 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69  empCur, pCur, si
15b20 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20  zeof(*pCur));.  
15b30 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
15b40 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
15b50 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
15b60 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  ( pTempCur->pPag
15b70 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15b80 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75  PagerRef(pTempCu
15b90 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
15ba0 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
15bb0 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
15bc0 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
15bd0 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
15be0 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
15bf0 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
15c00 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
15c10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15c20 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
15c30 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
15c40 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15c50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15c60 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
15c70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
15c80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
15c90 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
15ca0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
15cb0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
15cc0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
15cd0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
15ce0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
15cf0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
15d00 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
15d10 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
15d20 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
15d30 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
15d40 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
15d50 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
15d60 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
15d70 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
15d80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
15d90 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
15da0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
15db0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
15dc0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
15dd0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
15de0 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
15df0 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
15e00 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
15e10 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
15e20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
15e30 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
15e40 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
15e50 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
15e60 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
15e70 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
15e80 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
15e90 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
15ea0 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
15eb0 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
15ec0 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
15ed0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
15ee0 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
15ef0 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
15f00 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
15f10 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
15f20 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
15f30 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
15f40 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
15f50 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
15f60 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
15f70 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
15f80 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
15f90 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15fa0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
15fb0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
15fc0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
15fd0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
15fe0 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
15ff0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
16000 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
16010 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
16020 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
16030 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  >idx, &info);.  
16040 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
16050 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
16060 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
16070 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
16080 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
16090 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
160a0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
160b0 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
160c0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
160d0 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
160e0 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
160f0 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
16100 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
16110 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
16120 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
16130 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
16140 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
16150 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
16160 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
16170 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
16180 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
16190 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
161a0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
161b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
161c0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
161d0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
161e0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
161f0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
16200 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
16210 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
16220 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
16230 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
16240 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
16250 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
16290 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
162a0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
162e0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
162f0 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
16300 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
16310 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20  );         \.   
16320 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
16330 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
163b0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
163c0 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
16400 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
16410 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
16420 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
16430 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
16440 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
16450 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
16460 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
16470 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
16480 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
16490 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
164a0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
164b0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
164c0 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
164d0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
164e0 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
164f0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
16500 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
16510 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
16520 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16530 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
16540 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16550 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
16560 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
16570 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
16580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
16590 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
165a0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
165b0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
165c0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
165d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
165e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
165f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16600 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
16610 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16620 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
16630 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
16640 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16650 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
16660 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16670 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
16680 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
16690 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
166a0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
166b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
166c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
166d0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
166e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
166f0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
16700 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
16710 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
16720 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
16730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
16740 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
16750 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
16760 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
16770 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
16780 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
16790 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
167a0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
167b0 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
167c0 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
167d0 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
167e0 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
167f0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
16800 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
16810 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
16820 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
16830 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
16840 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
16850 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
16860 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
16870 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
16880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
16890 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
168a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
168b0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
168c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
168d0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
168e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
168f0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
16900 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
16910 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
16920 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
16930 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
16940 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
16950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
16960 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
16970 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
16980 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
16990 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
169a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
169b0 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
169c0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
169d0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
169e0 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
169f0 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
16a00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
16a10 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
16a20 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
16a30 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
16a40 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
16a50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
16a60 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
16a70 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
16a80 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
16a90 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
16aa0 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
16ab0 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
16ac0 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
16ad0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
16ae0 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
16af0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
16b00 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
16b10 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ise:.**.** Unles
16b20 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e  s pPgnoNext is N
16b30 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20 6e 75  ULL, the page nu
16b40 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
16b50 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
16b60 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
16b70 20 6c 69 73 74 20 69 73 20 77 72 69 74 74 65 6e   list is written
16b80 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
16b90 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20  If page ovfl.** 
16ba0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
16bb0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c   in its linked l
16bc0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
16bd0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
16be0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
16bf0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70   is not NULL, *p
16c00 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
16c10 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e  the MemPage* han
16c20 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20  dle.** for page 
16c30 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c  ovfl. The underl
16c40 79 69 6e 67 20 70 61 67 65 72 20 70 61 67 65 20  ying pager page 
16c50 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 72 65  may have been re
16c60 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20  quested.** with 
16c70 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
16c80 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70  ag set, so the p
16c90 61 67 65 20 64 61 74 61 20 61 63 63 65 73 73 61  age data accessa
16ca0 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20  ble via.** this 
16cb0 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62  handle may not b
16cc0 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  e trusted..*/.st
16cd0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
16ce0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
16cf0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67  ared *pBt, .  Pg
16d00 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
16d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76             /* Ov
16d20 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20  erflow page */. 
16d30 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
16d40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
16d50 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
16d60 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ndle */.  Pgno *
16d70 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
16d80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
16d90 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
16da0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
16db0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
16dc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
16dd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16de0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
16df0 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20  ex) );.  /* One 
16e00 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f  of these must no
16e10 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72  t be NULL. Other
16e20 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74  wise, why call t
16e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f  his function? */
16e40 0a 20 20 61 73 73 65 72 74 28 70 70 50 61 67 65  .  assert(ppPage
16e50 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a   || pPgnoNext);.
16e60 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65  .  /* If pPgnoNe
16e70 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  xt is NULL, then
16e80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16e90 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74  s being called t
16ea0 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20  o obtain.  ** a 
16eb0 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e  MemPage* referen
16ec0 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65  ce only. No page
16ed0 2d 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65  -data is require
16ee0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
16ef0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e    */.  if( !pPgn
16f00 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74  oNext ){.    ret
16f10 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
16f20 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
16f30 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  l, ppPage, 1);. 
16f40 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16f50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
16f60 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
16f70 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
16f80 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
16f90 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
16fa0 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
16fb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
16fc0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
16fd0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
16fe0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
16ff0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
17000 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
17010 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
17020 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
17030 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
17040 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
17050 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
17060 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
17070 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
17080 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
17090 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
170a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
170b0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
170c0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
170d0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
170e0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
170f0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
17100 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
17110 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
17120 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
17130 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
17140 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
17150 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70     if( iGuess<=p
17160 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17170 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
17180 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
17190 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
171a0 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
171b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
171c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
171d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
171e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
171f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
17200 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
17210 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
17220 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
17230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17240 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
17250 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67  next==0 || ppPag
17260 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  e ){.    MemPage
17270 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
17280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
17290 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
172a0 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65  ovfl, &pPage, ne
172b0 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65  xt!=0);.    asse
172c0 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
172d0 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20   || pPage==0);. 
172e0 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26     if( next==0 &
172f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17300 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
17310 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
17320 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20  aData);.    }.. 
17330 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b     if( ppPage ){
17340 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
17350 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73   pPage;.    }els
17360 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e{.      release
17370 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
17380 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e   }.  }.  *pPgnoN
17390 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72  ext = next;..  r
173a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
173b0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
173c0 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
173d0 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
173e0 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
173f0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
17400 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17410 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
17420 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
17430 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
17440 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
17450 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
17460 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
17470 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
17480 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
17490 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
174a0 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
174b0 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
174c0 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
174d0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
174e0 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
174f0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
17500 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
17510 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
17520 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
17530 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
17540 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
17550 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
17560 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
17570 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
17580 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
17590 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
175a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
175b0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
175c0 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
175d0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
175e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
175f0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
17600 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
17610 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17620 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
17630 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
17660 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
17670 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
17680 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
17690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
176a0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
176b0 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
176c0 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
176d0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
176e0 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
176f0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
17700 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
17710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17720 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
17730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17740 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
17750 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17760 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
17770 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
17780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17790 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
177a0 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
177b0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
177c0 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
177d0 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
177e0 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
177f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17800 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17810 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
17820 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
17830 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
17840 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
17850 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
17860 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
17870 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66   pointing to. If
17880 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61   the eOp.** para
17890 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73  meter is 0, this
178a0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
178b0 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65  tion (data copie
178c0 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72  d into.** buffer
178d0 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73   pBuf). If it is
178e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69   non-zero, a wri
178f0 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  te (data copied 
17900 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70  from.** buffer p
17910 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  Buf)..**.** A to
17920 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
17930 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
17940 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
17950 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
17960 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
17970 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
17980 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
17990 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
179a0 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73  s not make a dis
179b0 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e  tinction between
179c0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a   key and data..*
179d0 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20  * It just reads 
179e0 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20  or writes bytes 
179f0 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64  from the payload
17a00 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67   area.  Data mig
17a10 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e  ht .** appear on
17a20 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
17a30 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
17a40 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
17a50 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
17a60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
17a70 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62  BtCursor.isIncrb
17a80 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
17a90 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63  s set, and the c
17aa0 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72  urrent.** cursor
17ab0 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
17ac0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
17ad0 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e   pages, this fun
17ae0 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
17af0 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  es space for and
17b00 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65   lazily popluate
17b10 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
17b20 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63  age-list .** cac
17b30 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
17b40 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53  or.aOverflow). S
17b50 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
17b60 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68  use this.** cach
17b70 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
17b80 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
17b90 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66  d offset more ef
17ba0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
17bb0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
17bc0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
17bd0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
17be0 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
17bf0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
17c00 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
17c10 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
17c20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
17c30 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
17c40 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
17c50 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
17c60 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
17c70 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
17c80 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
17c90 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
17ca0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
17cb0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17cc0 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
17cd0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
17ce0 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
17cf0 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
17d00 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
17d10 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
17d20 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
17d30 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
17d40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
17d50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
17d60 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
17d70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
17d80 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
17d90 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
17da0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
17db0 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20    int offset,   
17dc0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
17dd0 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
17de0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
17df0 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
17e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
17e10 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
17e20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
17e30 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
17e40 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
17e50 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
17e60 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c   .  int skipKey,
17e70 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73           /* offs
17e80 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74  et begins at dat
17e90 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
17ea0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20  e */.  int eOp  
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
17ec0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
17ed0 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
17ee0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
17ef0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
17f00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17f10 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
17f20 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
17f30 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
17f40 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
17f50 65 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  e;     /* Btree 
17f60 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
17f70 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a  cursor entry */.
17f80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
17fb0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
17fc0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
17fd0 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
17fe0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
17ff0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
18010 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18020 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
18030 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
18040 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
18050 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18060 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18070 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
18080 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
18090 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
180a0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
180b0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
180c0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
180d0 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69  ey ? 0 : pCur->i
180e0 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
180f0 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
18100 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b   offset += nKey;
18110 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
18120 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
18130 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b  r->info.nData ){
18140 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
18150 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
18160 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
18170 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
18180 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
18190 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
181a0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
181b0 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
181c0 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
181d0 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
181e0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
181f0 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
18200 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
18210 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
18220 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
18230 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
18240 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
18250 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
18260 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
18270 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
18280 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18290 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
182a0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
182b0 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
182c0 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
182d0 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
182e0 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
182f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
18300 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
18310 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
18320 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74   pBt = pCur->pBt
18330 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18340 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
18350 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18360 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
18370 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
18380 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
18390 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
183a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
183b0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
183c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
183d0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
183e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
183f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18400 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18410 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
18420 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
18430 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
18440 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
18450 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
18460 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
18470 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
18480 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
18490 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
184a0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
184b0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
184c0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
184d0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
184e0 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
184f0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
18500 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
18510 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
18520 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
18530 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
18540 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
18550 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
18560 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
18570 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
18580 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
18590 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
185a0 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
185b0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
185c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
185d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
185e0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
185f0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
18600 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
18610 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
18620 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
18630 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
18640 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18650 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
18660 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
18670 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
18680 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
18690 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
186a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
186b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
186c0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
186d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
186e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
186f0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
18700 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
18710 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
18720 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
18730 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
18740 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
18750 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
18760 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
18770 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
18780 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
18790 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
187a0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
187b0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
187c0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
187d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
187e0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
187f0 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
18800 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
18810 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
18820 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
18830 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
18840 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
18850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
18860 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
18870 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
18880 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
18890 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
188a0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
188b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
188c0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
188d0 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
188e0 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
188f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18900 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
18910 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
18920 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
18930 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
18940 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
18950 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
18960 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18970 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
18980 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
18990 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
189a0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
189b0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
189c0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
189d0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
189e0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
189f0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
18a00 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
18a10 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
18a20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
18a30 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
18a40 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
18a50 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
18a60 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
18a70 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
18a80 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
18a90 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
18aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18ab0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
18ac0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
18ad0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
18ae0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18af0 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
18b00 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
18b10 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18b20 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
18b30 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
18b40 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
18b50 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
18b60 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
18b70 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
18b80 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
18b90 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
18ba0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
18bb0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
18bc0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
18bd0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
18be0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
18bf0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
18c00 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
18c10 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
18c20 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
18c30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18c40 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
18c50 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
18c60 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
18c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18c80 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
18c90 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
18ca0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18cb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
18cd0 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
18ce0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
18cf0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18d00 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
18d10 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
18d20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
18d30 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
18d40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18d50 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
18d60 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
18d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18d80 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
18d90 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
18da0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
18db0 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
18dc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18dd0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
18de0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
18df0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
18e00 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
18e10 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
18e20 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
18e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18e40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18e50 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
18e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18e70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18e80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
18ea0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
18eb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18ec0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
18ed0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
18ee0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
18ef0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
18f00 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
18f10 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
18f20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
18f30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18f40 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
18f50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
18f60 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
18f70 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
18f80 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
18f90 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
18fa0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
18fb0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
18fc0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
18fd0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
18fe0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
18ff0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
19000 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
19010 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19020 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19030 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19040 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
19050 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
19060 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19080 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19090 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
190a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
190b0 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
190c0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
190d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
190e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
190f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19100 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
19110 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
19120 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
19130 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
19140 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
19150 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
19160 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
19170 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
19180 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
19190 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
191a0 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
191b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
191c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
191d0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
191e0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
191f0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
19200 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
19210 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
19220 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
19230 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
19240 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
19250 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
19260 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
19270 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
19280 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19290 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
192a0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
192b0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
192c0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
192d0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
192e0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
192f0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
19300 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19310 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19320 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
19330 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
19340 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
19350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19360 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
19370 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19380 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
193a0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
193b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
193c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
193d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
193e0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
193f0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19400 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19410 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19420 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19430 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19440 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19450 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
19460 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19470 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
19480 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
19490 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
194a0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
194b0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
194c0 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b  mt, pBuf, 1, 0);
194d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
194e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
194f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
19500 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
19510 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
19520 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
19530 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
19540 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
19550 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
19560 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
19570 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
19580 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
19590 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
195a0 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
195b0 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
195c0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
195d0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
195e0 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
195f0 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
19600 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
19610 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
19620 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
19630 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
19640 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
19650 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19660 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
19670 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
19680 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
19690 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
196a0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
196b0 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
196c0 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
196d0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
196e0 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
196f0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
19700 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
19710 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
19720 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
19730 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
19740 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
19750 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
19760 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
19770 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
19780 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
19790 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
197a0 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
197b0 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
197c0 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
197d0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
197e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
197f0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
19800 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
19810 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
19820 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
19830 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19840 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
19850 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
19860 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
19870 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
19880 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
198a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
198b0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
198c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
198d0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
198e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
198f0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
19900 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
19910 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19920 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
19930 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
19940 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
19950 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
19960 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
19970 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
19980 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
19990 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
199a0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
199b0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
199c0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
199d0 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
199e0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
199f0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
19a00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19a10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19a20 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
19a30 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19a40 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
19a50 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
19a60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19a70 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
19a80 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
19a90 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
19aa0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
19ab0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
19ac0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
19ad0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
19ae0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
19af0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
19b00 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
19b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
19b20 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
19b30 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
19b40 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
19b50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
19b60 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
19b70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
19b80 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
19b90 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
19ba0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
19bb0 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
19bc0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
19bd0 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
19be0 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
19bf0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
19c00 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
19c10 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
19c20 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
19c30 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
19c40 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
19c50 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
19c60 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
19c70 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
19c80 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
19c90 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
19ca0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19cb0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
19cc0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
19cd0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
19ce0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
19cf0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
19d00 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
19d10 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
19d20 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
19d30 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
19d40 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
19d50 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
19d60 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
19d70 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
19d80 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
19d90 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
19da0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
19db0 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
19dc0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
19dd0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
19de0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
19df0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
19e00 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
19e10 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
19e20 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
19e30 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
19e40 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
19e50 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
19e60 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
19e70 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
19e80 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
19e90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19ea0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19eb0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
19ec0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19ed0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
19ee0 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
19ef0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
19f00 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
19f10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
19f20 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
19f30 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
19f40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19f50 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
19f60 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19f70 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19f80 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19f90 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19fa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
19fb0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
19fc0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
19fd0 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
19fe0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
19ff0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a000 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
1a010 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
1a020 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
1a030 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
1a040 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a050 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
1a060 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
1a070 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1a080 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1a090 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1a0a0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1a0b0 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1a0c0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67  MemPage *pOldPag
1a0d0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1a0e0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1a0f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a100 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a110 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a120 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a130 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
1a140 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1a150 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1a160 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72   &pNewPage, pCur
1a170 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  ->pPage);.  if( 
1a180 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a190 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50    pNewPage->idxP
1a1a0 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64  arent = pCur->id
1a1b0 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20  x;.  pOldPage = 
1a1c0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
1a1d0 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66  OldPage->idxShif
1a1e0 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  t = 0;.  release
1a1f0 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a  Page(pOldPage);.
1a200 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a210 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1a220 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75  ->idx = 0;.  pCu
1a230 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1a240 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
1a250 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
1a260 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
1a270 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
1a280 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a290 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
1a2a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a2b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1a2c0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
1a2d0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
1a2e0 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
1a2f0 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
1a300 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
1a310 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
1a320 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
1a330 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
1a340 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
1a350 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
1a360 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
1a370 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
1a380 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
1a390 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
1a3a0 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
1a3b0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
1a3c0 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
1a3d0 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
1a3e0 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
1a3f0 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
1a400 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
1a410 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1a420 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1a430 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1a440 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
1a450 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a460 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1a470 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
1a480 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
1a490 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
1a4a0 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
1a4b0 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
1a4c0 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
1a4d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
1a4e0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1a4f0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1a500 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
1a510 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1a520 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1a530 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a540 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1a550 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1a560 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1a570 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1a580 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1a590 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1a5a0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1a5b0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1a5c0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1a5d0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1a5e0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1a5f0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1a600 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1a610 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1a620 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1a630 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1a640 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1a650 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1a660 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1a670 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
1a680 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
1a690 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
1a6a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1a6b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1a6c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a6d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a6e0 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65  VALID );.  pPage
1a6f0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1a700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
1a710 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a720 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
1a730 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1a740 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
1a750 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
1a760 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1a770 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a780 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2d 3e  pPage->pDbPage->
1a790 6e 52 65 66 3e 30 20 29 3b 0a 20 20 69 64 78 50  nRef>0 );.  idxP
1a7a0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69  arent = pPage->i
1a7b0 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69  dxParent;.  sqli
1a7c0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
1a7d0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
1a7e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1a7f0 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
1a800 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  ge = pParent;.  
1a810 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a820 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1a830 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61  lidNKey = 0;.  a
1a840 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1a850 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
1a860 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
1a870 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
1a880 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a890 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1a8a0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1a8b0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1a8c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1a8d0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1a8e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a8f0 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
1a900 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1a910 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a920 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
1a930 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1a940 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1a950 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
1a960 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
1a970 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1a980 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a990 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
1a9a0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a9b0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1a9c0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
1a9d0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1a9e0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1a9f0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
1aa00 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
1aa10 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1aa20 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
1aa30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
1aa40 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
1aa50 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
1aa60 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1aa70 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
1aa80 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1aa90 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
1aaa0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1aab0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
1aac0 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
1aad0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1aae0 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1aaf0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1ab00 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1ab10 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1ab20 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
1ab30 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
1ab40 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1ab50 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1ab60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ab70 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1ab80 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
1ab90 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
1aba0 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
1abb0 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
1abc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1abd0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
1abe0 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
1abf0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1ac00 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
1ac10 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
1ac20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1ac30 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
1ac40 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1ac50 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
1ac60 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
1ac70 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
1ac80 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
1ac90 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1aca0 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
1acb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1acc0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
1acd0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1ace0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
1acf0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  );.  }.  pCur->e
1ad00 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e  State = ((pCur->
1ad10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pPage->nCell>0)?
1ad20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1ad30 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1ad40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ad50 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1ad60 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1ad70 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
1ad80 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1ad90 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
1ada0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1adb0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
1adc0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
1add0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
1ade0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
1adf0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
1ae00 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
1ae10 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1ae20 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
1ae30 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
1ae40 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1ae50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1ae60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1ae70 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1ae80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ae90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1aea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1aeb0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1aec0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1aed0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1aee0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1aef0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1af00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1af10 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1af20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1af30 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1af40 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1af50 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1af60 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72  ur->idx));.    r
1af70 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1af80 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1af90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1afa0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1afb0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1afc0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1afd0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1afe0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1aff0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1b000 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1b010 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1b020 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1b030 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1b040 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1b050 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1b060 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1b070 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1b080 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1b090 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1b0a0 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1b0b0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1b0c0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1b0d0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1b0e0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1b0f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1b100 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1b110 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1b120 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1b130 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1b140 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1b150 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1b160 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1b170 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1b180 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1b190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1b1a0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1b1b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b1c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b1e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b1f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1b200 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1b210 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1b220 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1b230 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1b240 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1b250 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1b260 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1b270 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1b280 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1b290 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1b2a0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1b2b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1b2d0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1b2e0 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43  Cell - 1;.    pC
1b2f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1b300 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1b310 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
1b320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b330 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1b340 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
1b350 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1b360 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1b370 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1b380 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1b390 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1b3a0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1b3b0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1b3c0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1b3d0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1b3e0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1b3f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b400 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
1b410 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1b420 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1b430 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b440 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b450 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b460 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1b470 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1b480 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1b490 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1b4a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1b4c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b4d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1b4e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b4f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1b500 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
1b510 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1b520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b540 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1b550 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
1b560 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1b570 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1b580 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1b590 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1b5a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1b5b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1b5c0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1b5d0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1b5e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1b5f0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1b600 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1b610 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1b620 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1b630 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1b640 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1b650 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1b660 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1b670 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1b680 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b690 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1b6a0 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1b6b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b6c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1b6d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b6e0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1b6f0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1b700 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1b710 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1b720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b730 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
1b740 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1b750 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1b760 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b770 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
1b780 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b790 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1b7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1b7b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b7c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1b7d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1b7e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1b7f0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1b800 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1b810 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
1b820 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
1b830 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20  =SQLITE_OK;.    
1b840 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b850 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1b860 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1b870 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1b880 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
1b890 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
1b8a0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
1b8b0 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
1b8c0 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1b8d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1b8e0 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
1b8f0 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
1b900 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
1b910 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
1b920 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1b930 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
1b940 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
1b950 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
1b960 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
1b970 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
1b980 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
1b990 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
1b9a0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
1b9b0 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
1b9c0 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
1b9d0 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
1b9e0 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
1b9f0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
1ba00 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
1ba10 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
1ba20 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
1ba30 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
1ba40 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1ba50 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1ba60 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1ba70 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
1ba80 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
1ba90 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
1baa0 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
1bab0 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
1bac0 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
1bad0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1bae0 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1baf0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1bb00 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1bb10 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1bb40 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
1bb50 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
1bb60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1bb70 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
1bb80 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
1bb90 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
1bba0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
1bbb0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
1bbc0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1bbd0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1bbe0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
1bc00 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
1bc10 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
1bc20 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
1bc30 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1bc40 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1bc50 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
1bc70 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
1bc80 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
1bc90 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1bca0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
1bcb0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
1bcc0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1bcd0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1bce0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1bcf0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
1bd00 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1bd10 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd30 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
1bd40 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
1bd50 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1bd60 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1bd70 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1bd80 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1bd90 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1bda0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1bdb0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
1bdc0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1bdd0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1bde0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1bdf0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1be00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1be10 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1be20 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1be30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1be40 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1be50 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
1be60 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
1be70 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
1be80 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
1be90 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
1bea0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
1beb0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
1bec0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1bed0 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
1bee0 69 64 4e 4b 65 79 20 26 26 20 70 43 75 72 2d 3e  idNKey && pCur->
1bef0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1bf00 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1bf10 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
1bf20 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
1bf30 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1bf40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1bf50 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1bf60 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
1bf70 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
1bf80 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1bf90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1bfa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bfb0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72 63 20     }.  }...  rc 
1bfc0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1bfd0 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
1bfe0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bff0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1c000 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
1c010 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1c020 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
1c030 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1c040 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c050 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
1c060 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1c070 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1c080 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
1c090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c0a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1c0b0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
1c0c0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
1c0d0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
1c0e0 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50   lwr, upr;.    P
1c0f0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
1c100 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1c110 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1c120 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f    int c = -1;  /
1c130 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66  * pRes return if
1c140 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20   table is empty 
1c150 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20  must be -1 */.  
1c160 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
1c170 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
1c180 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50  l-1;.    if( !pP
1c190 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
1c1a0 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  IdxKey==0 ){.   
1c1b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1c1c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c1d0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c1e0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
1c1f0 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29   if( biasRight )
1c200 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64  {.      pCur->id
1c210 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c  x = upr;.    }el
1c220 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
1c230 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f  idx = (upr+lwr)/
1c240 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
1c250 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28   lwr<=upr ) for(
1c260 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  ;;){.      void 
1c270 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1c280 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1c290 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1c2a0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
1c2b0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1c2c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1c2d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1c2e0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1c2f0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
1c300 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1c310 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b  ge, pCur->idx) +
1c320 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
1c330 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1c340 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1c350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
1c360 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
1c370 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
1c380 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64  arint32(pCell, d
1c390 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
1c3a0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
1c3b0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
1c3c0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
1c3d0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
1c3e0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
1c3f0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
1c400 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1c410 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
1c420 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1c430 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1c440 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
1c450 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e  ert( nCellKey>in
1c460 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
1c470 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
1c480 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1c490 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1c4a0 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1c4b0 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1c4c0 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1c4d0 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1c4e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1c4f0 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1c500 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1c510 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1c520 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1c530 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1c540 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c550 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  are(nCellKey, pC
1c560 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
1c570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c580 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1c590 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
1c5a0 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  loc( nCellKey );
1c5b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c5c0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
1c5d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c5e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c5f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1c600 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c620 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c630 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1c640 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64   nCellKey, (void
1c650 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20   *)pCellKey);.  
1c660 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1c670 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c680 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1c690 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1c6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1c6b0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
1c6c0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1c6d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1c6e0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1c6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c700 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1c710 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1c720 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1c730 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1c740 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1c750 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c760 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1c770 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20   pCur->idx;.    
1c780 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20        upr = lwr 
1c790 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  - 1;.          b
1c7a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c7b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1c7c0 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
1c7d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
1c7e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c7f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1c800 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c820 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
1c830 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1c840 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20  ur->idx+1;.     
1c850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c860 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d  upr = pCur->idx-
1c870 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1c880 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
1c890 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1c8a0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1c8b0 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ey;.        brea
1c8c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c8d0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77   pCur->idx = (lw
1c8e0 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+upr)/2;.    }.
1c8f0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
1c900 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
1c910 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1c920 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
1c930 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c940 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
1c950 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
1c960 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
1c970 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1c980 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1c990 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1c9a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1c9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c9c0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1c9d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1c9e0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
1c9f0 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
1ca00 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1ca10 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
1ca20 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
1ca30 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
1ca40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
1ca50 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
1ca60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ca70 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
1ca80 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1ca90 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1caa0 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75  x = lwr;.    pCu
1cab0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1cac0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1cad0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
1cae0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1caf0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1cb00 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1cb10 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1cb20 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
1cb30 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
1cb40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
1cb50 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
1cb60 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
1cb70 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
1cb80 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
1cb90 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
1cba0 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1cbb0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
1cbc0 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
1cbd0 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
1cbe0 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
1cbf0 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
1cc00 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   work..*/.int sq
1cc10 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1cc20 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1cc30 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
1cc40 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
1cc50 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
1cc60 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
1cc70 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
1cc80 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
1cc90 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
1cca0 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
1ccb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1ccc0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
1ccd0 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
1cce0 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
1ccf0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
1cd00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
1cd10 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
1cd20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1cd30 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1cd40 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
1cd50 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
1cd60 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
1cd90 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1cda0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
1cdb0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1cdc0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ex key */.  Unpa
1cdd0 63 6b 65 64 52 65 63 6f 72 64 20 61 53 70 61 63  ckedRecord aSpac
1cde0 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d 70 20 73  e[16]; /* Temp s
1cdf0 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
1ce00 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
1ce10 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70  lloc */..  if( p
1ce20 4b 65 79 20 29 7b 0a 20 20 20 20 70 49 64 78 4b  Key ){.    pIdxK
1ce30 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1ce40 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1ce50 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  r->pKeyInfo, nKe
1ce60 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ce90 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
1cea0 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
1ceb0 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
1cec0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1ced0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1cee0 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
1cef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1cf00 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1cf10 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
1cf20 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
1cf30 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29  s);.  if( pKey )
1cf40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1cf50 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
1cf60 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
1cf70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cf80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
1cf90 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1cfa0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1cfb0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1cfc0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1cfd0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1cfe0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1cff0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1d000 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1d010 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1d020 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1d030 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1d040 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1d050 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1d060 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1d070 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1d080 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1d090 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1d0a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1d0b0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1d0c0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1d0d0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1d0e0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1d0f0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1d100 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1d110 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1d120 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1d130 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1d140 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1d150 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1d160 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1d170 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1d180 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1d190 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1d1a0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1d1b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1d1c0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1d1d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
1d1e0 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a  e for a cursor..
1d1f0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
1d200 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 44 62  te3BtreeCursorDb
1d210 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20  (const BtCursor 
1d220 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1d230 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d240 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1d250 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1d260 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1d270 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f  pBtree->db;.}../
1d280 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1d290 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1d2a0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1d2b0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1d2c0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1d2d0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1d2e0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1d2f0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1d300 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1d310 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d320 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1d330 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1d340 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1d350 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1d360 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d370 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1d380 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1d390 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1d3a0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1d3b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1d3c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1d3d0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1d3e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1d3f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1d400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d420 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
1d430 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  0 );.  pPage = p
1d440 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
1d450 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1d460 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1d470 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1d480 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d490 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d4a0 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b   pCur->skip>0 ){
1d4b0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1d4c0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1d4d0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1d4e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d4f0 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1d500 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d510 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1d520 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c  sert( pCur->idx<
1d530 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1d540 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a  .  pCur->idx++;.
1d550 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1d560 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1d570 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1d580 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
1d590 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1d5a0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1d5b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1d5c0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1d5d0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1d5e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d5f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1d600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1d610 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d620 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1d630 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1d640 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1d650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d660 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1d670 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
1d680 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
1d690 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1d6a0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1d6b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1d6c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1d6d0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
1d6e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d6f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d700 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1d710 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1d720 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1d730 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1d740 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1d750 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1d760 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d770 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1d780 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
1d790 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1d7a0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1d7b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d7d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1d7e0 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
1d7f0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1d800 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
1d810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d820 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
1d830 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1d840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d850 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
1d860 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
1d870 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
1d880 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
1d890 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1d8a0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1d8b0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1d8c0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1d8d0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1d8e0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
1d8f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1d900 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
1d910 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1d920 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
1d930 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
1d940 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d950 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
1d960 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1d970 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1d980 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d    Pgno pgno;.  M
1d990 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1d9a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1d9b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1d9c0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1d9d0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1d9e0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1d9f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1da00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1da10 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
1da20 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
1da30 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1da40 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1da50 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1da60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1da70 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1da80 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1da90 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1daa0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1dab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dac0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1dad0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1dae0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1daf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1db00 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1db10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1db20 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
1db30 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1db40 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1db50 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
1db60 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
1db70 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1db80 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1db90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1dba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1dbb0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1dbc0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1dbd0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1dbe0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
1dbf0 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >idx==0 ){.     
1dc00 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1dc10 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1dc20 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
1dc30 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1dc40 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1dc50 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1dc60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1dc70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1dc80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1dc90 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1dca0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1dcb0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1dcc0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  e;.    }.    pCu
1dcd0 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43  r->idx--;.    pC
1dce0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1dcf0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1dd00 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
1dd10 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1dd20 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
1dd30 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1dd40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1dd50 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1dd60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1dd70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dd80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1dd90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1dda0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ddb0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1ddc0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1ddd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1dde0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1ddf0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1de00 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1de10 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
1de20 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
1de30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1de40 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
1de50 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
1de60 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
1de70 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
1de80 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
1de90 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
1dea0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1deb0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
1dec0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
1ded0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1dee0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1def0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1df00 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1df10 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1df20 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1df30 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1df40 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1df50 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1df60 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1df70 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1df80 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1df90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1dfa0 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1dfb0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1dfc0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1dfd0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1dfe0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1dff0 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1e000 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1e010 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1e020 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1e030 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1e040 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1e050 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1e060 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1e070 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1e080 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1e090 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1e0a0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1e0b0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1e0c0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1e0d0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1e0e0 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1e0f0 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
1e100 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
1e110 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
1e120 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
1e130 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1e140 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
1e150 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
1e160 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
1e170 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
1e180 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1e190 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
1e1a0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
1e1b0 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
1e1c0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1e1d0 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
1e1e0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
1e1f0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1e200 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
1e210 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
1e220 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
1e230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1e240 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1e250 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
1e260 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1e270 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1e280 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
1e290 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
1e2a0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
1e2b0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1e2c0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1e2d0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1e2e0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
1e2f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1e300 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e310 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e320 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1e330 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
1e340 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1e350 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
1e360 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
1e370 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
1e380 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1e390 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
1e3a0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
1e3b0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
1e3c0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
1e3d0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
1e3e0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
1e3f0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
1e400 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
1e410 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
1e420 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
1e430 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
1e440 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
1e450 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
1e460 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
1e470 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
1e480 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
1e490 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
1e4a0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
1e4b0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
1e4c0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
1e4d0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
1e4e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e4f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1e500 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
1e510 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  rby<=pagerPageco
1e520 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1e530 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
1e540 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
1e550 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
1e560 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1e570 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
1e580 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1e590 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
1e5a0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
1e5b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e5c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
1e5d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1e5e0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1e5f0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1e600 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1e610 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
1e620 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1e630 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
1e640 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
1e650 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
1e660 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
1e670 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
1e680 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
1e690 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
1e6a0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
1e6b0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
1e6c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e6d0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1e6e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e6f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e700 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
1e710 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1e720 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
1e730 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
1e740 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
1e750 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
1e760 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
1e770 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
1e780 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
1e790 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
1e7a0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1e7b0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
1e7c0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
1e7d0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
1e7e0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
1e7f0 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
1e800 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
1e810 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
1e820 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
1e830 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1e840 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1e850 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1e860 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
1e870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e880 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1e890 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e8a0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
1e8b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e8c0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1e8d0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
1e8e0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  unk, 0);.      i
1e8f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1e900 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1e910 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e920 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e930 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
1e940 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1e950 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1e960 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
1e970 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
1e980 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1e990 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
1e9a0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
1e9b0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
1e9c0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
1e9d0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
1e9e0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
1e9f0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
1ea00 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
1ea10 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
1ea20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1ea30 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
1ea40 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
1ea50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ea60 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1ea70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ea80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ea90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1eaa0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1eab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eac0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
1ead0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1eae0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1eaf0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1eb00 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1eb10 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1eb20 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
1eb30 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1eb40 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1eb50 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1eb60 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1eb70 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1eb80 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
1eb90 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
1eba0 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
1ebb0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1ebc0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
1ebd0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
1ebe0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
1ebf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ec00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ec10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ec20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1ec30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ec40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ec50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1ec60 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
1ec70 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
1ec80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
1ec90 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
1eca0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
1ecb0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
1ecc0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1ecd0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
1ece0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
1ecf0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
1ed00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ed10 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1ed20 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
1ed30 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1ed40 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1ed50 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1ed60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ed70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ed80 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1ed90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1eda0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1edb0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1edc0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1edd0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
1ede0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1edf0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1ee00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1ee10 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1ee20 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1ee30 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1ee40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1ee60 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
1ee70 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1ee80 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1ee90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1eea0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1eeb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1eec0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
1eed0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
1eee0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
1eef0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
1ef00 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
1ef10 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
1ef20 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
1ef30 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
1ef40 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1ef50 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
1ef60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ef70 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
1ef80 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
1ef90 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
1efa0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1efb0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
1efc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1efd0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1efe0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
1eff0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
1f000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
1f030 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f040 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1f050 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1f060 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f070 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
1f080 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f0b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f0c0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f0d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f0e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f0f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f100 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1f110 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
1f120 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1f130 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1f140 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
1f150 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
1f160 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1f170 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1f180 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
1f190 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
1f1a0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
1f1b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1f1c0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1f1d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1f1e0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1f1f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f200 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1f210 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
1f220 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f240 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f250 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
1f260 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f270 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1f280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
1f290 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f2a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1f2b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1f2c0 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
1f2d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1f2e0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1f2f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f300 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
1f310 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1f320 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f330 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1f340 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1f350 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1f360 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1f370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1f380 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
1f390 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
1f3a0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c  /.        int cl
1f3b0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
1f3c0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
1f3d0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1f3e0 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
1f3f0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
1f400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f410 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1f420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1f430 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f440 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1f450 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1f460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f470 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
1f480 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
1f490 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
1f4a0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1f4b0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
1f4c0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1f4d0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1f4e0 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
1f4f0 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
1f500 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1f510 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
1f520 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1f530 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
1f540 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
1f550 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
1f560 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
1f570 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
1f580 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
1f590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f5a0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
1f5c0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
1f5d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1f5e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f5f0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1f600 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1f610 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
1f620 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1f630 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
1f640 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
1f650 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
1f660 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
1f670 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65         int nPage
1f680 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
1f690 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
1f6a0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61        nPage = pa
1f6b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1f6c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
1f6d0 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
1f6e0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
1f6f0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1f700 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1f710 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1f720 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1f730 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f740 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
1f750 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f760 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1f770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
1f780 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f790 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
1f7a0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
1f7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7c0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
1f7d0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
1f7f0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
1f800 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
1f810 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
1f820 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
1f830 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1f840 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
1f850 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
1f860 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
1f870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f880 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f890 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1f8a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f8b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f8c0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1f8d0 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  ppPage, 1);.    
1f8e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f8f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1f910 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1f920 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1f930 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1f940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f950 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
1f960 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1f970 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f990 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1f9a0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
1f9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1f9c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f9d0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1f9e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1f9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1fa00 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1fa10 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
1fa20 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
1fa30 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
1fa40 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1fa50 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
1fa60 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
1fa70 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
1fa80 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
1fa90 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
1faa0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
1fab0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
1fac0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fad0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1fae0 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65    *pPgno = nPage
1faf0 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53   + 1;..#ifndef S
1fb00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fb10 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1fb20 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20  t->nTrunc ){.   
1fb30 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61     /* An incr-va
1fb40 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79  cuum has already
1fb50 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73   run within this
1fb60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
1fb70 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
1fb80 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69  ge to allocate i
1fb90 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70  s not from the p
1fba0 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74  hysical end of t
1fbb0 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20  he file, but.   
1fbc0 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54     ** at pBt->nT
1fbd0 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  runc. .      */.
1fbe0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70        *pPgno = p
1fbf0 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20  Bt->nTrunc+1;.  
1fc00 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
1fc10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1fc20 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1fc30 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
1fc40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fc50 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1fc60 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
1fc70 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
1fc80 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
1fc90 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
1fca0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
1fcb0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
1fcc0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
1fcd0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
1fce0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
1fcf0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
1fd00 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
1fd10 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
1fd20 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
1fd30 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
1fd40 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
1fd50 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
1fd60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1fd70 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1fd80 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1fd90 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
1fda0 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
1fdb0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
1fdc0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1fdd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1fde0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
1fdf0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
1fe00 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
1fe10 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1fe20 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
1fe30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1fe40 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a   pBt->nTrunc ){.
1fe50 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
1fe60 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20  c = *pPgno;.    
1fe70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  }.#endif..    as
1fe80 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1fe90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fea0 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
1feb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1fec0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1fed0 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
1fee0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1fef0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1ff00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ff10 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1ff20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ff30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ff40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ff50 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
1ff60 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
1ff70 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
1ff80 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
1ff90 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
1ffa0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1ffb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ffc0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
1ffd0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
1ffe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
1fff0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
20000 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
20010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20020 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65  /*.** Add a page
20030 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20040 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65   file to the fre
20050 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c  elist..**.** sql
20060 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
20070 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66   is NOT called f
20080 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
20090 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
200a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
200b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
200c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
200d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
200e0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
200f0 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b  .  int rc, n, k;
20100 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
20110 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65  he page for free
20120 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ing */.  assert(
20130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20140 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
20150 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
20160 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
20170 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  1 );.  pPage->is
20180 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Init = 0;.  rele
20190 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70  asePage(pPage->p
201a0 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65  Parent);.  pPage
201b0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a  ->pParent = 0;..
201c0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
201d0 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
201e0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
201f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20200 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
20210 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
20220 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20230 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
20240 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20250 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
20260 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20270 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
20280 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
20290 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
202a0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
202b0 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
202c0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
202d0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
202e0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
202f0 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
20300 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
20310 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
20320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20330 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
20340 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
20350 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20360 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
20370 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
20380 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
20390 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
203a0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
203b0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
203c0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
203d0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
203e0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
203f0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
20400 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
20410 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
20420 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
20430 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
20440 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  Page->pgno, PTRM
20450 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
20460 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20470 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
20480 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
20490 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
204a0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a  irst free page *
204b0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
204c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
204d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
204e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
204f0 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74  n rc;.    memset
20500 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
20510 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 8);.    put4by
20520 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20530 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
20540 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28  no);.    TRACE((
20550 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66  "FREE-PAGE: %d f
20560 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  irst\n", pPage->
20570 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
20580 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72  .    /* Other fr
20590 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  ee pages already
205a0 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65   exist.  Retrive
205b0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
205c0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20   page.    ** of 
205d0 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
205e0 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61   find out how ma
205f0 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73  ny leaves it has
20600 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
20610 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63   *pTrunk;.    rc
20620 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
20630 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  etPage(pBt, get4
20640 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20650 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e  ata[32]), &pTrun
20660 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
20670 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20680 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
20690 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
206a0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  ]);.    if( k>=p
206b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
206c0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
206d0 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75   The trunk is fu
206e0 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61  ll.  Turn the pa
206f0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 69  ge being freed i
20700 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20  nto a new.      
20710 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69  ** trunk page wi
20720 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20  th no leaves..  
20730 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20740 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
20750 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
20760 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
20770 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
20780 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
20790 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
207a0 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
207b0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
207c0 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
207d0 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
207e0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
207f0 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
20800 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
20810 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
20820 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
20830 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
20840 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
20850 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
20860 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
20870 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
20880 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
20890 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
208a0 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
208b0 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
208c0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
208d0 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
208e0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
208f0 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
20900 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
20910 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
20920 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
20930 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
20940 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
20950 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
20960 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
20970 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
20980 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
20990 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
209a0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
209b0 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
209c0 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
209d0 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
209e0 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
209f0 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
20a00 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
20a10 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
20a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20a30 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
20a40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20a60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
20a70 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
20a80 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  ta, pTrunk->pgno
20a90 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
20aa0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
20ab0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  a[4], 0);.      
20ac0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
20ad0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
20ae0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
20af0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
20b00 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
20b10 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
20b20 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ing %d\n",.     
20b30 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
20b40 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e  ->pgno, pTrunk->
20b50 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pgno));.      }.
20b60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c      }else if( k<
20b70 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20b80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
20b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20ba0 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c   /* Add the newl
20bb0 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20  y freed page as 
20bc0 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75  a leaf on the cu
20bd0 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20  rrent trunk */. 
20be0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20bf0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
20c00 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
20c10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20c30 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
20c40 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31  k->aData[4], k+1
20c50 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
20c60 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
20c70 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
20c80 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
20c90 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
20ca0 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 72 63  ELETE.        rc
20cb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 44   = sqlite3PagerD
20cc0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
20cd0 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  pDbPage);.#endif
20ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
20cf0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
20d00 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
20d10 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
20d20 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
20d30 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
20d40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20d50 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72  pTrunk);.  }.  r
20d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20d70 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
20d80 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
20d90 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
20da0 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74  iven Cell..*/.st
20db0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
20dc0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
20dd0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
20de0 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68   *pCell){.  BtSh
20df0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
20e00 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
20e10 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
20e20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
20e30 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
20e40 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53  .  int ovflPageS
20e50 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
20e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
20e70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
20e80 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
20e90 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
20ea0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
20eb0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
20ec0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
20ed0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
20ee0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
20ef0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
20f00 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
20f10 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
20f20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
20f30 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
20f40 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
20f50 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65  ow]);.  ovflPage
20f60 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
20f70 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
20f80 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
20f90 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
20fa0 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
20fb0 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
20fc0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
20fd0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
20fe0 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
20ff0 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
21000 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b   MemPage *pOvfl;
21010 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
21020 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  o==0 || ovflPgno
21030 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
21040 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
21050 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21060 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
21080 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
21090 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
210a0 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d   &pOvfl, (nOvfl=
210b0 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29  =0)?0:&ovflPgno)
210c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
210d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
210e0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66   = freePage(pOvf
210f0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  l);.    sqlite3P
21100 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
21110 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
21120 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21130 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
21140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21150 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
21160 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
21170 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
21180 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
21190 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
211a0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
211b0 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
211c0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
211d0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
211e0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
211f0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
21200 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
21210 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
21220 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
21230 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
21240 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
21250 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
21260 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
21270 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
21280 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
21290 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
212a0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
212b0 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
212c0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
212d0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
212e0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
212f0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
21300 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
21310 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
21320 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
21330 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
21340 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
21350 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
21360 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
21370 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
21380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21390 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
213a0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
213b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
213c0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
213d0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
213e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
213f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
21400 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
21410 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
21420 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
21430 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
21440 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
21450 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
21480 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
21490 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
214a0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
214b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
214c0 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
214d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
214e0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
214f0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
21500 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
21510 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
21520 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
21530 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
21540 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
21550 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21560 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
21570 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
21580 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
21590 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
215a0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
215b0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
215c0 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
215d0 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
215e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
215f0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21600 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
21610 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
21620 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
21630 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
21640 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
21650 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
21660 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
21670 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
21680 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
21690 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
216a0 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
216b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
216c0 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
216d0 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
216e0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
216f0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
21700 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
21710 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21720 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
21730 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
21740 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
21750 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
21760 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21770 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
21780 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
21790 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f  ata==nData+nZero
217a0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
217b0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
217c0 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
217d0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
217e0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
217f0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
21800 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
21810 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
21820 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
21830 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
21840 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
21850 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
21860 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
21870 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
21880 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
21890 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
218a0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
218b0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
218c0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
218d0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
218e0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
218f0 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
21900 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
21910 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78  {.      int isEx
21920 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  act = 0;.#ifndef
21930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21940 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
21950 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
21960 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
21970 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
21980 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
21990 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
219a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
219b0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
219c0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
219d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
219e0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
219f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
21a00 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
21a10 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
21a20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21a30 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
21a40 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66       if( pgnoOvf
21a50 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>1 ){.         
21a60 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b   /* isExact = 1;
21a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
21a80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21a90 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
21aa0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
21ab0 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
21ac0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78  , pgnoOvfl, isEx
21ad0 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  act);.#ifndef SQ
21ae0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21af0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
21b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
21b10 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
21b20 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
21b30 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
21b40 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
21b50 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
21b60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
21b70 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
21b80 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
21b90 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
21ba0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
21bb0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
21bc0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
21bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
21be0 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
21bf0 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
21c00 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
21c10 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
21c20 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
21c30 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
21c40 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
21c50 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
21c60 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
21c70 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
21c80 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
21c90 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
21ca0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
21cb0 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
21cc0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
21cd0 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
21ce0 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
21cf0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
21d00 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
21d10 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
21d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21d30 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
21d40 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
21d50 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
21d60 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
21d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
21d80 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
21d90 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
21da0 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
21db0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21dc0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21dd0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
21de0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
21df0 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
21e00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
21e10 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
21e20 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
21e30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21e40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
21e50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
21e60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
21e70 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
21e80 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
21e90 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
21ea0 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
21eb0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
21ec0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
21ed0 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
21ee0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
21ef0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
21f00 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
21f10 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
21f20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
21f30 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
21f40 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
21f50 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
21f60 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
21f70 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
21f80 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
21f90 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
21fa0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
21fb0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
21fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21fd0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
21fe0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
21ff0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
22000 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
22010 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
22020 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
22030 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
22040 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
22050 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
22060 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
22070 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
22080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
22090 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
220a0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
220b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
220c0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d  .** Change the M
220d0 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70  emPage.pParent p
220e0 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61  ointer on the pa
220f0 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20  ge whose number 
22100 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74  is.** given in t
22110 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
22120 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61  nt so that MemPa
22130 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  ge.pParent holds
22140 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20   the.** pointer 
22150 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67  in the third arg
22160 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
22170 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75 6d 65  the final argume
22180 6e 74 2c 20 75 70 64 61 74 65 50 74 72 6d 61 70  nt, updatePtrmap
22190 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  , is non-zero an
221a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  d the database.*
221b0 2a 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  * is an auto-vac
221c0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
221d0 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
221e0 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 67 6e  ap entry for pgn
221f0 6f 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 2e  o.** is updated.
22200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
22210 65 70 61 72 65 6e 74 50 61 67 65 28 0a 20 20 42  eparentPage(.  B
22220 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22240 42 2d 54 72 65 65 20 73 74 72 75 63 74 75 72 65  B-Tree structure
22250 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
22280 65 72 20 6f 66 20 63 68 69 6c 64 20 62 65 69 6e  er of child bein
22290 67 20 61 64 6f 70 74 65 64 20 2a 2f 0a 20 20 4d  g adopted */.  M
222a0 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65  emPage *pNewPare
222b0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
222c0 4e 65 77 20 70 61 72 65 6e 74 20 6f 66 20 70 67  New parent of pg
222d0 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  no */.  int idx,
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
22300 66 20 63 68 69 6c 64 20 70 61 67 65 20 70 67 6e  f child page pgn
22310 6f 20 69 6e 20 70 4e 65 77 50 61 72 65 6e 74 20  o in pNewParent 
22320 2a 2f 0a 20 20 69 6e 74 20 75 70 64 61 74 65 50  */.  int updateP
22330 74 72 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  trmap           
22340 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 75     /* If true, u
22350 70 64 61 74 65 20 70 6f 69 6e 74 65 72 2d 6d 61  pdate pointer-ma
22360 70 20 66 6f 72 20 70 67 6e 6f 20 2a 2f 0a 29 7b  p for pgno */.){
22370 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69  .  MemPage *pThi
22380 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  s;.  DbPage *pDb
22390 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
223a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
223b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
223c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  );.  assert( pNe
223d0 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20  wParent!=0 );.  
223e0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
223f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22400 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
22410 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44  Pager!=0 );.  pD
22420 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
22430 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
22440 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
22450 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
22460 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d      pThis = (Mem
22470 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
22480 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
22490 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  age);.    if( pT
224a0 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  his->isInit ){. 
224b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68       assert( pTh
224c0 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  is->aData==sqlit
224d0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
224e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
224f0 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
22500 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20  ent!=pNewParent 
22510 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22520 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20  This->pParent ) 
22530 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22540 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  f(pThis->pParent
22550 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22560 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65      pThis->pPare
22570 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b  nt = pNewParent;
22580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22590 50 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72  PagerRef(pNewPar
225a0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
225b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68       }.      pTh
225c0 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  is->idxParent = 
225d0 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  idx;.    }.    s
225e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
225f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
22600 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
22610 55 4d 20 26 26 20 75 70 64 61 74 65 50 74 72 6d  UM && updatePtrm
22620 61 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ap ){.    return
22630 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
22640 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
22650 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e  EE, pNewParent->
22660 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pgno);.  }..#ifn
22670 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
22680 49 66 20 74 68 65 20 75 70 64 61 74 65 50 74 72  If the updatePtr
22690 6d 61 70 20 66 6c 61 67 20 77 61 73 20 63 6c 65  map flag was cle
226a0 61 72 2c 20 61 73 73 65 72 74 20 74 68 61 74 20  ar, assert that 
226b0 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
226c0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  .  ** pointer-ma
226d0 70 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 72  p is already cor
226e0 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rect..  */.  if(
226f0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
22700 0a 20 20 20 20 70 44 62 50 61 67 65 20 3d 20 73  .    pDbPage = s
22710 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
22720 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 50 54  p(pBt->pPager,PT
22730 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
22740 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20  pgno));.    if( 
22750 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 20  pDbPage ){.     
22760 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
22770 20 50 67 6e 6f 20 69 69 3b 0a 20 20 20 20 20 20   Pgno ii;.      
22780 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61 70 47  int rc = ptrmapG
22790 65 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 65  et(pBt, pgno, &e
227a0 54 79 70 65 2c 20 26 69 69 29 3b 0a 20 20 20 20  Type, &ii);.    
227b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
227c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3d 3d 70  LITE_OK && ii==p
227d0 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 20  NewParent->pgno 
227e0 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
227f0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
22800 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22810 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
22820 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
22830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22840 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
22850 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
22860 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
22870 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
22880 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
22890 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
228a0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
228b0 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
228c0 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
228d0 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
228e0 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
228f0 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
22900 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
22910 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
22920 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22930 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
22940 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
22950 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
22960 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a  o.** another..**
22970 0a 2a 2a 20 49 66 20 75 70 64 61 74 65 50 74 72  .** If updatePtr
22980 6d 61 70 20 69 73 20 74 72 75 65 2c 20 74 68 65  map is true, the
22990 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
229a0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
229b0 6c 20 63 68 69 6c 64 0a 2a 2a 20 70 61 67 65 73  l child.** pages
229c0 20 6f 66 20 70 50 61 67 65 20 61 72 65 20 75 70   of pPage are up
229d0 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
229e0 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69   int reparentChi
229f0 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ldPages(MemPage 
22a00 2a 70 50 61 67 65 2c 20 69 6e 74 20 75 70 64 61  *pPage, int upda
22a10 74 65 50 74 72 6d 61 70 29 7b 0a 20 20 69 6e 74  tePtrmap){.  int
22a20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22a30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22a40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
22a50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
22a60 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
22a70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
22a80 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
22a90 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
22aa0 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 69 52  pBt;.    Pgno iR
22ab0 69 67 68 74 20 3d 20 67 65 74 34 62 79 74 65 28  ight = get4byte(
22ac0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
22ad0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
22ae0 5d 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ]);..    for(i=0
22af0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
22b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
22b10 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
22b20 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
22b30 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
22b40 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
22b50 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67  yte(pCell), pPag
22b60 65 2c 20 69 2c 20 75 70 64 61 74 65 50 74 72 6d  e, i, updatePtrm
22b70 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ap);.      if( r
22b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
22b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22ba0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
22bb0 74 50 61 67 65 28 70 42 74 2c 20 69 52 69 67 68  tPage(pBt, iRigh
22bc0 74 2c 20 70 50 61 67 65 2c 20 69 2c 20 75 70 64  t, pPage, i, upd
22bd0 61 74 65 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  atePtrmap);.    
22be0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
22bf0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
22c00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22c10 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
22c20 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
22c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
22c40 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
22c50 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
22c60 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
22c70 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
22c80 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
22c90 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
22ca0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
22cb0 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
22cc0 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
22cd0 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
22ce0 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
22cf0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
22d00 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
22d10 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
22d20 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
22d30 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
22d40 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
22d50 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
22d60 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
22d70 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
22d80 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
22d90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22da0 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
22db0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
22dc0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
22dd0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
22de0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
22df0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
22e00 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
22e10 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
22e20 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
22e30 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
22e40 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
22e50 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
22e60 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
22e70 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
22e80 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
22e90 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
22ea0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22eb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22ec0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
22ed0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22ee0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
22ef0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
22f00 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
22f10 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
22f20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
22f30 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
22f40 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
22f50 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65  yte(ptr);.  asse
22f60 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b  rt( pc>10 && pc+
22f70 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz<=pPage->pBt->
22f80 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
22f90 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
22fa0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28   pc, sz);.  for(
22fb0 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65  i=idx+1; i<pPage
22fc0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74  ->nCell; i++, pt
22fd0 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30  r+=2){.    ptr[0
22fe0 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20  ] = ptr[2];.    
22ff0 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b  ptr[1] = ptr[3];
23000 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
23010 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74  ell--;.  put2byt
23020 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
23030 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
23040 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
23050 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
23060 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
23070 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ft = 1;.}../*.**
23080 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
23090 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
230a0 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
230b0 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
230c0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
230d0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
230e0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
230f0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
23100 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
23110 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
23120 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
23130 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
23140 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
23150 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
23160 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
23170 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
23180 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
23190 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
231a0 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
231b0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
231c0 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
231d0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
231e0 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
231f0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
23200 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
23210 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
23220 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
23230 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
23240 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
23250 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
23260 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
23270 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
23280 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
23290 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
232a0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
232b0 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
232c0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
232d0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
232e0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
232f0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
23300 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
23310 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
23320 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
23330 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
23340 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
23350 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
23360 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
23370 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
23380 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
23390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
233a0 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
233b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
233c0 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
233d0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
233e0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
233f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
23400 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
23410 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
23420 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
23430 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
23440 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
23450 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
23460 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
23470 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
23480 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
23490 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
234a0 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
234b0 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
234c0 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
234d0 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20  .  u8 nSkip     
234e0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77       /* Do not w
234f0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e  rite the first n
23500 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
23510 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  e cell */.){.  i
23520 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
23530 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
23540 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
23550 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
23560 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
23570 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23580 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
23590 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  p;          /* F
235a0 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e  irst byte of con
235b0 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c  tent for any cel
235c0 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  l in data[] */. 
235d0 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20   int end;       
235e0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
235f0 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63   past the last c
23600 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
23610 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ata[] */.  int i
23620 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ns;          /* 
23630 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20  Index in data[] 
23640 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70  where new cell p
23650 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74  ointer is insert
23660 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ed */.  int hdr;
23670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
23680 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20  set into data[] 
23690 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64  of the page head
236a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
236b0 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64  Offset;   /* Add
236c0 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65  ress of first ce
236d0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
236e0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ta[] */.  u8 *da
236f0 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
23700 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
23710 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
23720 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
23730 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20      /* Used for 
23740 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  moving informati
23750 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74  on around in dat
23760 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  a[] */..  assert
23770 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
23780 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
23790 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
237a0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
237b0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
237c0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
237d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
237e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
237f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
23800 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
23810 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
23820 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
23830 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
23840 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
23850 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
23860 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
23870 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
23880 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  p;.    }.    j =
23890 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
238a0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
238b0 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d   j<sizeof(pPage-
238c0 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
238d0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20  Page->aOvfl[0]) 
238e0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
238f0 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
23900 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
23910 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
23920 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  i;.    pPage->nF
23930 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
23940 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
23950 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23960 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
23970 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
23980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
239a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
239b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
239c0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
239d0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
239e0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
239f0 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ;.    hdr = pPag
23a00 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
23a10 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
23a20 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
23a30 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
23a40 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
23a50 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
23a60 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
23a70 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20  ge->nCell + 2;. 
23a80 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
23a90 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69  set + 2*i;.    i
23aa0 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73  f( end > top - s
23ab0 7a 20 29 7b 0a 20 20 20 20 20 20 64 65 66 72 61  z ){.      defra
23ac0 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
23ad0 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  ;.      top = ge
23ae0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23af0 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
23b00 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
23b10 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
23b20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
23b30 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
23b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
23b50 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
23b60 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
23b70 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
23b80 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
23b90 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
23ba0 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20  ->nFree -= 2;.  
23bb0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
23bc0 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
23bd0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
23be0 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64  );.    for(j=end
23bf0 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d  -2, ptr=&data[j]
23c00 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70  ; j>ins; j-=2, p
23c10 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74  tr-=2){.      pt
23c20 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a  r[0] = ptr[-2];.
23c30 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70        ptr[1] = p
23c40 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  tr[-1];.    }.  
23c50 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23c60 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
23c70 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
23c80 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
23c90 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
23ca0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a  ->idxShift = 1;.
23cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23cc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
23cd0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
23ce0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
23cf0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
23d00 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
23d10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
23d20 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
23d30 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
23d40 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
23d50 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
23d60 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
23d70 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
23d80 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  */.      CellInf
23d90 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71  o info;.      sq
23da0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
23db0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
23dc0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
23dd0 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f     assert( (info
23de0 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
23df0 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
23e00 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
23e10 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ad );.      if( 
23e20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
23e30 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
23e40 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c  o.nKey))>info.nL
23e50 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
23e60 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
23e70 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
23e80 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
23e90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
23ea0 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
23eb0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  pBt, pgnoOvfl, P
23ec0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
23ed0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
23ee0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
23ef0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
23f00 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
23f10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
23f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23f30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
23f40 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
23f50 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
23f60 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
23f70 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
23f80 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
23f90 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
23fa0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
23fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23fc0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
23fd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
23fe0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
23ff0 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
24000 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
24010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
24020 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
24030 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
24040 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
24050 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
24060 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
24070 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
24080 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
24090 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
240a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
240b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
240c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
240d0 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20  nt totalSize;   
240e0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
240f0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20  f all cells */. 
24100 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
24110 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
24120 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
24130 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20  int cellptr;    
24140 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
24150 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
24160 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
24170 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
24180 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
24190 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64   body */.  u8 *d
241a0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
241b0 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  Data for the pag
241c0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
241d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
241e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
241f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24200 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
24210 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74 61  mutex) );.  tota
24220 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72  lSize = 0;.  for
24230 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
24240 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69  ++){.    totalSi
24250 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  ze += aSize[i];.
24260 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f    }.  assert( to
24270 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c  talSize+2*nCell<
24280 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b  =pPage->nFree );
24290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
242a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
242b0 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d  cellptr = pPage-
242c0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64  >cellOffset;.  d
242d0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
242e0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
242f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
24300 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
24310 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
24320 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20   if( nCell ){.  
24330 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c    cellbody = all
24340 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
24350 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20  , totalSize);.  
24360 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
24370 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dy>0 );.    asse
24380 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
24390 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20   >= 2*nCell );. 
243a0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
243b0 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20  -= 2*nCell;.    
243c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
243d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75  ; i++){.      pu
243e0 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
243f0 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  lptr], cellbody)
24400 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
24410 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
24420 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
24430 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c  [i]);.      cell
24440 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ptr += 2;.      
24450 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a  cellbody += aSiz
24460 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e[i];.    }.    
24470 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
24480 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
24490 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  ableSize );.  }.
244a0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
244b0 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nCell;.}../*.**
244c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
244d0 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
244e0 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
244f0 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
24500 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
24510 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
24520 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
24530 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
24540 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
24550 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
24560 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
24570 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
24580 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
24590 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
245a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
245b0 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
245c0 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
245d0 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
245e0 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
245f0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
24600 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
24610 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
24620 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
24630 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
24640 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
24650 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
24660 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
24670 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
24680 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
24690 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
246a0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
246b0 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
246c0 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
246d0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
246e0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
246f0 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
24700 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
24710 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
24720 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
24730 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24740 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
24750 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
24760 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
24770 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
24780 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
24790 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
247a0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f  he balance */../
247b0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
247c0 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
247d0 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67  t balance(MemPag
247e0 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64  e*, int);..#ifnd
247f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
24800 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
24810 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
24820 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
24830 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
24840 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
24850 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
24860 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
24870 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
24880 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
24890 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
248a0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
248b0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
248c0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
248d0 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
248e0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
248f0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
24900 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
24910 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
24920 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
24930 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
24940 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
24950 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
24960 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
24970 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
24980 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
24990 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
249a0 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
249b0 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
249c0 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
249d0 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
249e0 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
249f0 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
24a00 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
24a10 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
24a20 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
24a30 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
24a40 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
24a50 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
24a60 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
24a70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
24a80 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
24a90 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
24aa0 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
24ab0 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
24ac0 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
24ad0 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
24ae0 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
24af0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24b00 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
24b10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
24b20 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
24b30 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d  Page *pPage, Mem
24b40 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a  Page *pParent){.
24b50 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
24b60 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e  age *pNew;.  Pgn
24b70 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20  o pgnoNew;.  u8 
24b80 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a  *pCell;.  u16 sz
24b90 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  Cell;.  CellInfo
24ba0 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65   info;.  BtShare
24bb0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
24bc0 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e  pBt;.  int paren
24bd0 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e  tIdx = pParent->
24be0 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72  nCell;   /* pPar
24bf0 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20  ent new divider 
24c00 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
24c10 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20  int parentSize; 
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77    /* Size of new
24c40 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
24c50 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c  .  u8 parentCell
24c60 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [64];           
24c70 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
24c80 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  r the new divide
24c90 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73  r cell */..  ass
24ca0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
24cb0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
24cc0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
24cd0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
24ce0 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20  ew page. Insert 
24cf0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
24d00 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a  l from pPage.  *
24d10 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20  * into it. Then 
24d20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66  remove the overf
24d30 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
24d40 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  age..  */.  rc =
24d50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
24d60 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
24d70 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
24d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
24da0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c  n rc;.  }.  pCel
24db0 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
24dc0 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43  [0].pCell;.  szC
24dd0 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
24de0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
24df0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77  .  zeroPage(pNew
24e00 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
24e10 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61  ]);.  assemblePa
24e20 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
24e30 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20  ll, &szCell);.  
24e40 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
24e50 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20   = 0;..  /* Set 
24e60 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
24e70 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  e newly allocate
24e80 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e  d page to pParen
24e90 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50  t. */.  pNew->pP
24ea0 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
24eb0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
24ec0 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
24ed0 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  age);..  /* pPag
24ee0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  e is currently t
24ef0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
24f00 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67  f pParent. Chang
24f10 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74  e this.  ** so t
24f20 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  hat the right-ch
24f30 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70  ild is the new p
24f40 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62  age allocated ab
24f50 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61  ove and.  ** pPa
24f60 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74  ge is the next-t
24f70 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a  o-right child. .
24f80 20 20 2a 2a 0a 20 20 2a 2a 20 49 67 6e 6f 72 65    **.  ** Ignore
24f90 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
24fa0 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  e of the call to
24fb0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66   fillInCell(). f
24fc0 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 2a 2a  illInCell().  **
24fd0 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75 72 6e   may only return
24fe0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
24ff0 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73 20 72  TE_OK if it is r
25000 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f 63  equired to alloc
25010 61 74 65 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  ate.  ** one or 
25020 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
25030 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e  ges. Since an in
25040 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54  ternal table B-T
25050 72 65 65 20 63 65 6c 6c 20 0a 20 20 2a 2a 20 6d  ree cell .  ** m
25060 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f  ay never spill o
25070 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  ver onto an over
25080 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73  flow page (it is
25090 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20   a maximum of . 
250a0 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e 20   ** 13 bytes in 
250b0 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f 74  size), it is not
250c0 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20 63   neccessary to c
250d0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
250e0 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  code..  **.  ** 
250f0 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69  Similarly, the i
25100 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63  nsertCell() func
25110 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
25120 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   if the page.  *
25130 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  * being inserted
25140 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79   into is already
25150 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68   writable and th
25160 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
25170 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e  .  ** contain an
25180 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65   overflow pointe
25190 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 69  r. So ignore thi
251a0 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  s return code to
251b0 6f 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  o..  */.  assert
251c0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
251d0 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   );.  pCell = fi
251e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
251f0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
25200 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
25210 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
25220 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
25230 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61    fillInCell(pPa
25240 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
25250 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
25260 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  0, 0, 0, &parent
25270 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
25280 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29   parentSize<64 )
25290 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
252a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
252b0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
252c0 50 61 67 65 29 20 29 3b 0a 20 20 69 6e 73 65 72  Page) );.  inser
252d0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
252e0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
252f0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
25300 2c 20 30 2c 20 34 29 3b 0a 20 20 70 75 74 34 62  , 0, 4);.  put4b
25310 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
25320 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72  Cell(pParent,par
25330 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e  entIdx), pPage->
25340 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74  pgno);.  put4byt
25350 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
25360 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
25370 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
25380 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
25390 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
253a0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
253b0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
253c0 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e  map.  ** with en
253d0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
253e0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
253f0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
25400 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74   .  ** cell on t
25410 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
25420 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
25430 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
25440 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  CUUM ){.    rc =
25450 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
25460 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
25470 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
25480 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
25490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
254a0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
254b0 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
254c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
254d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
254e0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
254f0 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  age(pNew);.     
25500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25510 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65  }.  }..  /* Rele
25520 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
25530 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
25540 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68  e and balance th
25550 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20  e parent page,. 
25560 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
25570 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73  divider cell ins
25580 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20  erted caused it 
25590 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  to become overfu
255a0 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ll..  */.  relea
255b0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
255c0 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70  return balance(p
255d0 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65  Parent, 0);.}.#e
255e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
255f0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
25600 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
25610 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
25620 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
25630 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
25640 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
25650 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
25660 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
25670 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
25680 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
25690 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
256a0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
256b0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
256c0 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
256d0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
256e0 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
256f0 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
25700 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
25710 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
25720 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
25730 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
25740 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
25750 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
25760 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
25770 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
25780 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
25790 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
257a0 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
257b0 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
257c0 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
257d0 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
257e0 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
257f0 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
25800 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
25810 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
25820 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
25830 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
25840 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
25850 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
25860 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
25870 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
25880 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
25890 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
258a0 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
258b0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
258c0 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
258d0 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
258e0 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
258f0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
25900 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
25910 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
25920 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
25930 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
25940 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
25950 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
25960 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
25970 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
25980 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
25990 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
259a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
259b0 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
259c0 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
259d0 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
259e0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
259f0 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
25a00 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
25a10 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
25a20 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
25a30 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
25a40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
25a50 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
25a60 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
25a70 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
25a80 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
25a90 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
25aa0 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
25ab0 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
25ac0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
25ad0 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
25ae0 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
25af0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
25b00 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
25b10 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
25b20 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
25b30 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
25b40 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
25b50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
25b60 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
25b70 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
25b80 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
25b90 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
25ba0 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
25bb0 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
25bc0 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
25bd0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
25be0 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
25bf0 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
25c00 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
25c10 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ot(MemPage *pPag
25c20 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
25c30 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
25c40 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
25c50 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
25c60 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
25c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25c80 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
25c90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
25ca0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
25cb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25cc0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
25cd0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
25ce0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
25cf0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
25d00 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
25d10 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
25d20 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25d50 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
25d60 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25d90 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
25da0 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25dd0 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
25de0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
25df0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25e00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
25e10 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
25e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
25e40 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
25e50 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
25e60 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e80 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
25e90 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
25ea0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
25eb0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25ed0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
25ee0 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
25ef0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
25f00 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
25f10 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
25f20 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
25f30 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
25f40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
25f50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
25f60 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
25f70 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
25f80 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
25f90 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
25fa0 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
25fb0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
25fc0 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
25fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
25fe0 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
25ff0 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
26000 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
26010 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
26020 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
26030 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
26040 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
26050 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
26060 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
26070 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
26080 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e1[] */.  int iS
26090 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20  pace2 = 0;      
260a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
260b0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
260c0 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e  Space2[] */.  in
260d0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
260e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
260f0 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
26100 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
26110 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
26120 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
26130 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
26140 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
26150 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
26160 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
26170 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
26180 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
26190 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
261a0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
261b0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
261c0 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
261d0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
261e0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
261f0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
26200 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
26210 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
26220 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
26230 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
26240 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
26250 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
26260 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
26270 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
26280 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
262a0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
262b0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
262c0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
262d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
262e0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
262f0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
26300 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
26310 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
26320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
26330 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
26340 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
26350 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
26360 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
26370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
26380 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
26390 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
263a0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
263b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
263c0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
263d0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
263e0 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
263f0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  ];         /* Sp
26400 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
26410 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
26420 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
26430 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
26440 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
26450 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
26460 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63  ls before balanc
26470 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  e */.  u8 *aSpac
26480 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  e2 = 0;       /*
26490 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66   Space for overf
264a0 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65 6c  low dividers cel
264b0 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65  ls after balance
264c0 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20   */.  u8 *aFrom 
264d0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
264e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
264f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
26500 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a  utex) );..  /* .
26510 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
26520 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
26530 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26540 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
26550 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
26560 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
26570 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
26580 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
26590 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
265a0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
265b0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
265c0 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
265d0 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
265e0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
265f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26600 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
26610 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
26620 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
26630 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
26640 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
26650 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
26660 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
26670 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
26680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26690 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
266a0 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
266b0 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
266c0 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
266d0 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
266e0 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
266f0 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
26700 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
26710 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
26720 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
26730 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
26740 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
26750 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
26760 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
26770 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
26780 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
26790 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
267a0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
267b0 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
267c0 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
267d0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
267e0 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
267f0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
26800 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
26810 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
26820 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
26830 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
26840 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
26850 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
26860 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
26870 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
26880 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
26890 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
268a0 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
268b0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
268c0 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
268d0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
268e0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
268f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
26900 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
26910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
26920 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
26930 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    /*.    ** TODO
26940 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c  : Check the sibl
26950 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ings to the left
26960 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61   of pPage. It ma
26970 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  y be that.    **
26980 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75   they are not fu
26990 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61  ll and no new pa
269a0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ge is required..
269b0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
269c0 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
269d0 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
269e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
269f0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
26a00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26a10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
26a20 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65  Page)) ){.    re
26a30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
26a40 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
26a50 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72   cell in the par
26a60 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c  ent page whose l
26a70 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  eft child points
26a80 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50   back.  ** to pP
26a90 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20  age.  The "idx" 
26aa0 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20  variable is the 
26ab0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65  index of that ce
26ac0 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20  ll.  If pPage.  
26ad0 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d  ** is the rightm
26ae0 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
26af0 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64  rent then set id
26b00 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43  x to pParent->nC
26b10 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ell .  */.  if( 
26b20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66  pParent->idxShif
26b30 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
26b40 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70  no;.    pgno = p
26b50 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  Page->pgno;.    
26b60 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71  assert( pgno==sq
26b70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
26b80 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
26b90 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  age) );.    for(
26ba0 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65  idx=0; idx<pPare
26bb0 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b  nt->nCell; idx++
26bc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65 74  ){.      if( get
26bd0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
26be0 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70  Parent, idx))==p
26bf0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62  gno ){.        b
26c00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26c10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26c20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
26c30 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ll.             
26c40 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  || get4byte(&pPa
26c50 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
26c60 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
26c70 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65  ])==pgno );.  }e
26c80 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70  lse{.    idx = p
26c90 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
26ca0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
26cb0 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61  Initialize varia
26cc0 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74 20  bles so that it 
26cd0 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20  will be safe to 
26ce0 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74  jump.  ** direct
26cf0 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c  ly to balance_cl
26d00 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d  eanup at any mom
26d10 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64  ent..  */.  nOld
26d20 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73   = nNew = 0;.  s
26d30 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
26d40 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
26d50 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
26d60 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
26d70 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
26d80 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
26d90 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
26da0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
26db0 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
26dc0 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
26dd0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
26de0 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
26df0 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
26e00 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
26e10 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
26e20 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
26e30 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
26e40 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
26e50 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
26e60 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
26e70 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
26e80 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
26e90 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
26ea0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
26eb0 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
26ec0 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
26ed0 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
26ee0 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
26ef0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
26f00 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
26f10 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
26f20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
26f30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
26f40 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
26f50 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
26f60 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
26f70 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
26f80 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
26f90 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
26fa0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
26fb0 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
26fc0 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
26fd0 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
26fe0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
26ff0 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
27000 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
27010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
27020 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
27030 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
27040 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
27050 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
27060 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
27070 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
27080 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
27090 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
270a0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
270b0 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
270c0 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74  pOld[i], pParent
270d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
270e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
270f0 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  anup;.    apOld[
27100 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  i]->idxParent = 
27110 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d  k;.    apCopy[i]
27120 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
27130 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20  ( i==nOld );.   
27140 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61   nOld++;.    nMa
27150 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
27160 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
27170 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
27180 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
27190 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
271a0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
271b0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
271c0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
271d0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
271e0 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
271f0 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
27200 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
27210 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
27220 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
27230 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
27240 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
27250 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
27280 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
27290 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
272c0 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65    + (ROUND8(size
272d0 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74  of(MemPage))+pBt
272e0 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20  ->pageSize)*NB  
272f0 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
27300 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27330 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
27340 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
27350 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
27360 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
27370 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70  /* aFrom */.  ap
27380 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
27390 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
273a0 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
273b0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
273c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
273d0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
273e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
273f0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
27400 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
27410 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
27420 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
27430 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
27440 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
27450 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
27460 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
27470 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
27480 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
27490 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
274a0 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
274b0 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
274c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
274d0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
274e0 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
274f0 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
27500 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
27510 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
27520 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
27530 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
27540 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e  pace1 = &aCopy[N
27550 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  B-1][pBt->pageSi
27560 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
27570 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61  (MemPage))];.  a
27580 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65 31  ssert( ((aSpace1
27590 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
275a0 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
275b0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
275c0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28  equired */.  if(
275d0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
275e0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
275f0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
27600 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61  ize];.  }.  aSpa
27610 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ce2 = sqlite3Pag
27620 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67  eMalloc(pBt->pag
27630 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53  eSize);.  if( aS
27640 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20  pace2==0 ){.    
27650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27660 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
27670 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
27680 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
27690 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
276a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
276b0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
276c0 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
276d0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
276e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
276f0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
27700 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
27710 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
27720 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
27730 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
27740 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
27750 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
27760 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
27770 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
27780 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
27790 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
277a0 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
277b0 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
277c0 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d  )aCopy[i];.    m
277d0 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69  emcpy(p, apOld[i
277e0 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
277f0 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  e));.    p->aDat
27800 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d  a = (void*)&p[1]
27810 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
27820 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
27830 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
27840 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
27850 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
27860 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
27870 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
27880 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
27890 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
278a0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
278b0 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
278c0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
278d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
278e0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
278f0 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
27900 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
27910 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
27920 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
27930 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
27940 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
27950 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
27960 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
27970 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
27980 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
27990 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
279a0 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
279b0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
279c0 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
279d0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
279e0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
279f0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
27a00 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
27a10 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
27a20 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
27a30 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
27a40 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
27a50 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
27a60 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
27a70 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
27a80 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
27a90 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
27aa0 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
27ab0 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
27ac0 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
27ad0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
27ae0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
27af0 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
27b00 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
27b10 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
27b20 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
27b30 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
27b40 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
27b50 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
27b60 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
27b70 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
27b80 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68  fData = pPage->h
27b90 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
27ba0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
27bb0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
27bc0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
27bd0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
27be0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
27bf0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
27c00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
27c10 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
27c20 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
27c30 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27c40 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
27c50 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
27c60 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
27c70 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
27c80 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
27c90 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
27ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  );.      if( ISA
27cb0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
27cc0 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
27cd0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
27ce0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
27cf0 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
27d00 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
27d10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
27d20 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
27d30 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
27d40 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
27d50 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27d60 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
27d70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
27d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
27da0 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
27db0 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a  if( i<nOld-1 ){.
27dc0 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63        u16 sz = c
27dd0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
27de0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
27df0 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
27e00 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
27e10 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54  With the LEAFDAT
27e20 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20  A flag, pParent 
27e30 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20  cells hold only 
27e40 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20  INTKEYs that.   
27e50 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c       ** are dupl
27e60 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f  icates of keys o
27e70 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
27e80 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  s.  We need to r
27e90 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a  emove.        **
27ea0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
27eb0 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c  ls from pParent,
27ec0 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72   but the divider
27ed0 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a  s cells are not.
27ee0 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
27ef0 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63   to apCell[] bec
27f00 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75  ause they are du
27f10 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c  plicates of chil
27f20 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20  d cells..       
27f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70   */.        drop
27f40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
27f50 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
27f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
27f70 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
27f80 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
27f90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27fa0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
27fb0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  l] = sz;.       
27fc0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
27fd0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
27fe0 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
27ff0 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
28000 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
28010 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
28020 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
28030 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
28040 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
28050 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
28060 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
28070 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
28080 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
28090 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
280a0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
280b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
280c0 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
280d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
280e0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
280f0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
28100 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
28110 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43  [nCell] -= leafC
28120 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
28130 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
28140 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
28150 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
28160 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
28170 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
28180 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
28190 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
281a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
281b0 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
281c0 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
281d0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
281e0 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
281f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
28200 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
28210 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
28220 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
28230 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
28240 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
28250 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
28260 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
28270 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
28280 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
28290 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
282a0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
282b0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
282c0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
282d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
282e0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
282f0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
28300 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
28310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28320 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
28330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28340 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
28350 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
28360 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
28370 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
28380 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
28390 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
283a0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
283b0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
283c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
283d0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
283e0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
283f0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
28400 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
28410 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
28420 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
28430 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
28440 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
28450 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
28460 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
28470 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
28480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
28490 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
284a0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
284b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
284c0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
284d0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
284e0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
284f0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
28500 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
28510 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
28520 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
28530 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
28540 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
28550 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
28560 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
28570 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
28580 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
28590 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
285a0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
285b0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
285c0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
285d0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
285e0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
285f0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
28600 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
28610 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
28620 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
28630 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
28640 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
28650 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
28660 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
28670 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
28680 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
28690 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
286a0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
286b0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
286c0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
286d0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
286e0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
286f0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
28700 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
28710 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
28720 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
28730 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
28740 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
28750 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
28760 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
28770 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
28780 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
28790 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
287a0 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
287b0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
287c0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
287d0 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
287e0 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
287f0 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
28800 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
28810 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
28820 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
28830 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
28840 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
28850 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
28860 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
28870 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
28880 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
28890 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
288a0 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
288b0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
288c0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
288d0 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
288e0 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
288f0 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
28900 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
28910 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
28920 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
28930 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
28940 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
28950 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
28960 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
28970 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
28980 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
28990 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
289a0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
289b0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
289c0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
289d0 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
289e0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
289f0 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
28a00 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
28a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28a20 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
28a30 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
28a40 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
28a50 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
28a60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
28a70 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
28a80 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
28a90 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
28aa0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
28ab0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
28ac0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
28ad0 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
28ae0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
28af0 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
28b00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
28b10 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
28b20 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
28b30 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
28b40 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
28b50 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
28b60 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
28b70 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
28b80 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
28b90 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
28ba0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
28bb0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
28bc0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
28bd0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
28be0 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
28bf0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
28c00 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
28c10 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
28c20 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
28c30 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
28c40 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
28c50 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
28c60 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
28c70 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28c80 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
28c90 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
28ca0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
28cb0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
28cc0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
28cd0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
28ce0 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
28cf0 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
28d00 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
28d10 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
28d20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
28d30 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
28d40 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
28d50 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
28d60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28d70 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
28d80 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
28d90 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
28da0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
28db0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
28dc0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
28dd0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
28de0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
28df0 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
28e00 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
28e10 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
28e20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
28e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28e40 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
28e50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28e60 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
28e70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28e80 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28ea0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
28eb0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
28ec0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
28ed0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
28ee0 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
28ef0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
28f00 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
28f10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
28f20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
28f30 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
28f40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28f50 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
28f60 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
28f70 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
28f80 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
28f90 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
28fa0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
28fb0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
28fc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28fd0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28fe0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
28ff0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
29000 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
29010 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
29020 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
29030 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
29040 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
29050 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
29060 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
29070 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
29080 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
29090 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
290a0 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
290b0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
290c0 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
290d0 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
290e0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
290f0 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
29100 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
29110 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
29120 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
29130 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
29140 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
29150 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
29160 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
29170 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
29180 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
29190 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
291a0 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
291b0 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
291c0 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
291d0 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
291e0 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
291f0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
29200 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
29210 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
29220 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
29230 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
29240 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
29250 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
29260 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
29270 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
29280 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
29290 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
292a0 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75  f( pgnoNew[j]<(u
292b0 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
292c0 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
292d0 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
292e0 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20   pgnoNew[j];.   
292f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
29300 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
29310 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
29320 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
29330 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69     t = pgnoNew[i
29340 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  ];.      pT = ap
29350 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  New[i];.      pg
29360 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e  noNew[i] = pgnoN
29370 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
29380 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
29390 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67  [minI];.      pg
293a0 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b  noNew[minI] = t;
293b0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
293c0 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
293d0 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   }.  TRACE(("BAL
293e0 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
293f0 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29   %d  new: %d(%d)
29400 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
29410 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
29420 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c  .    pgnoOld[0],
29430 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
29440 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a  pgnoOld[1] : 0,.
29450 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67      nOld>=3 ? pg
29460 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20  noOld[2] : 0,.  
29470 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a    pgnoNew[0], sz
29480 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
29490 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d  >=2 ? pgnoNew[1]
294a0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
294b0 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
294c0 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f    nNew>=3 ? pgno
294d0 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[2] : 0, nNew
294e0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
294f0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
29500 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30  ? pgnoNew[3] : 0
29510 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
29520 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
29530 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=5 ? pgnoNew[
29540 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  4] : 0, nNew>=5 
29550 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
29560 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
29570 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
29580 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
29590 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
295a0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
295b0 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
295c0 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
295d0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
295e0 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
295f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
29600 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
29610 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
29620 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
29630 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
29640 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
29650 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
29660 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
29670 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d  rt( pNew->pgno==
29680 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20  pgnoNew[i] );.  
29690 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
296a0 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
296b0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
296c0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
296d0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
296e0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
296f0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
29700 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
29710 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
29720 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29730 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
29740 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
29750 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
29760 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
29770 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
29780 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
29790 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
297a0 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
297b0 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
297c0 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
297d0 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
297e0 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
297f0 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
29800 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
29810 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
29820 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
29830 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
29840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29850 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29860 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
29870 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
29880 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29890 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
298a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
298b0 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
298c0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
298d0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
298e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
298f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29900 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
29910 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29920 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61  SQLITE_OK && lea
29930 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
29940 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29950 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
29960 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
29970 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[k]), PTRMAP_BT
29980 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
29990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
299a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
299b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
299c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
299d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
299e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
299f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29a00 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e   }..    j = cntN
29a10 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
29a20 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
29a30 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
29a40 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
29a50 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29a60 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
29a70 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
29a80 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
29a90 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
29aa0 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
29ab0 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
29ac0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
29ad0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
29ae0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
29af0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
29b00 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
29b10 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
29b20 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
29b30 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
29b40 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
29b50 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32  pTemp = &aSpace2
29b60 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20  [iSpace2];.     
29b70 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
29b80 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
29b90 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
29ba0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
29bb0 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
29bc0 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20 20  OVACUUM .       
29bd0 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d    && (aFrom[j]==
29be0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
29bf0 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[j]]->pgno!=
29c00 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20  pNew->pgno).    
29c10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29c20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
29c30 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
29c40 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  ell), PTRMAP_BTR
29c50 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  EE, pNew->pgno);
29c60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29c70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29c80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
29c90 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
29cc0 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
29cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
29ce0 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
29cf0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
29d00 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
29d10 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
29d20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
29d30 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
29d40 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
29d50 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
29d60 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
29d70 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
29d80 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
29d90 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
29da0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
29db0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
29dc0 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
29dd0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
29de0 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
29df0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
29e00 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
29e10 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
29e20 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
29e30 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
29e40 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
29e50 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
29e60 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  mp;.        fill
29e70 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
29e80 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
29e90 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73  Key, 0, 0, 0, &s
29ea0 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  z);.        pTem
29eb0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
29ec0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
29ed0 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
29ee0 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
29ef0 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
29f00 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
29f10 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
29f20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
29f30 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
29f40 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
29f50 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
29f60 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
29f70 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
29f80 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
29f90 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
29fa0 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
29fb0 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
29fc0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
29fd0 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
29fe0 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
29ff0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
2a000 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
2a010 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
2a020 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
2a030 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
2a040 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
2a050 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
2a060 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
2a070 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2a080 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
2a090 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
2a0a0 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
2a0b0 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
2a0c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
2a0d0 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
2a0e0 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
2a0f0 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
2a100 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
2a110 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
2a120 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
2a130 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
2a140 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
2a150 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
2a160 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
2a170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
2a180 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
2a190 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
2a1a0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2a1b0 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
2a1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a1d0 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d        iSpace2 +=
2a1e0 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
2a1f0 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
2a200 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
2a210 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c  assert( iSpace2<
2a220 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
2a230 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
2a240 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2a250 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
2a260 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
2a270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a280 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
2a290 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2a2a0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2a2b0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2a2c0 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e  arent,nxDiv), pN
2a2d0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  ew->pgno);..    
2a2e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2a2f0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2a300 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74  atabase, and not
2a310 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
2a320 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
2a330 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2a340 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20  ter map with an 
2a350 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
2a360 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
2a370 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65    ** that the ce
2a380 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ll just inserted
2a390 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61   points to (if a
2a3a0 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
2a3b0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2a3c0 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61 74  CUUM && !leafDat
2a3d0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
2a3e0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2a3f0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
2a400 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2a410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a420 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2a430 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2a440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a450 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2a460 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
2a470 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
2a480 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2a490 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
2a4a0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
2a4b0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2a4c0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UUM ){.      rc 
2a4d0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2a4e0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
2a4f0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
2a500 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt->pgno);.     
2a510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2a530 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a540 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
2a550 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2a560 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
2a570 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
2a580 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
2a590 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
2a5a0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
2a5b0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
2a5c0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
2a5d0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
2a5e0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
2a5f0 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
2a600 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
2a610 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  4);.    if( ISAU
2a620 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2a630 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a640 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 7a  (pBt, get4byte(z
2a650 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f 42  Child), PTRMAP_B
2a660 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  TREE, apNew[nNew
2a670 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  -1]->pgno);.    
2a680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a6a0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2a6b0 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
2a6c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44   }.  }.  if( nxD
2a6d0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
2a6e0 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
2a6f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
2a700 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
2a710 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
2a720 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
2a730 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
2a740 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2a750 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2a760 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2a770 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
2a780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
2a790 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2a7a0 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
2a7b0 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
2a7c0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
2a7d0 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
2a7e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
2a7f0 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
2a800 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2a810 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
2a820 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
2a830 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
2a840 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
2a850 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20  parent children 
2a860 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20  of all cells..  
2a870 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2a880 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2a890 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
2a8a0 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d  ldPages(apNew[i]
2a8b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2a8c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2a8d0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a8e0 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72  up;.  }.  rc = r
2a8f0 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
2a900 73 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  s(pParent, 0);. 
2a910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a920 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
2a930 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a  e_cleanup;..  /*
2a940 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68  .  ** Balance th
2a950 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20  e parent page.  
2a960 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 75  Note that the cu
2a970 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 67  rrent page (pPag
2a980 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61  e) might.  ** ha
2a990 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f  ve been added to
2a9a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f   the freelist so
2a9b0 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e   it might no lon
2a9c0 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ger be initializ
2a9d0 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  ed..  ** But the
2a9e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c   parent page wil
2a9f0 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74  l always be init
2aa00 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
2aa10 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
2aa20 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c  >isInit );.  sql
2aa30 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
2aa40 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c  apCell);.  apCel
2aa50 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 62 61  l = 0;.  rc = ba
2aa60 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
2aa70 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
2aa80 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
2aa90 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
2aaa0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
2aab0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2aac0 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71  e(aSpace2);.  sq
2aad0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
2aae0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
2aaf0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2ab00 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2ab10 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2ab20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
2ab30 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
2ab40 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
2ab50 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  [i]);.  }.  rele
2ab60 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29  asePage(pParent)
2ab70 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2ab80 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69  NCE: finished wi
2ab90 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  th %d: old=%d ne
2aba0 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
2abb0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ,.          pPag
2abc0 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e  e->pgno, nOld, n
2abd0 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20  New, nCell));.  
2abe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2abf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ac00 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
2ac10 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2ac20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74 68 65  a btree when the
2ac30 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f   root.** page co
2ac40 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
2ac50 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70    This is an opp
2ac60 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65  ortunity to make
2ac70 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61   the tree.** sha
2ac80 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65  llower by one le
2ac90 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
2aca0 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  nt balance_shall
2acb0 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ower(MemPage *pP
2acc0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
2acd0 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  *pChild;        
2ace0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
2acf0 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70   child page of p
2ad00 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Page */.  Pgno p
2ad10 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20  gnoChild;       
2ad20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2ad30 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64  umber for pChild
2ad40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2ad50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ad60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ad70 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
2ad80 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72  ures */.  BtShar
2ad90 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2ada0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2adb0 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72 75   main BTree stru
2adc0 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  cture */.  int m
2add0 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20  xCellPerPage;   
2ade0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2adf0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  um number of cel
2ae00 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20  ls per page */. 
2ae10 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20   u8 **apCell;   
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae30 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20   All cells from 
2ae40 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
2ae50 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
2ae60 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
2ae70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
2ae80 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
2ae90 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
2aea0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2aeb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2aec0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2aed0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2aee0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2aef0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2af00 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  ) );.  pBt = pPa
2af10 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c  ge->pBt;.  mxCel
2af20 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45  lPerPage = MX_CE
2af30 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c  LL(pBt);.  apCel
2af40 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
2af50 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  c( mxCellPerPage
2af60 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69  *(sizeof(u8*)+si
2af70 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20  zeof(u16)) );.  
2af80 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20  if( apCell==0 ) 
2af90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2afa0 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  MEM;.  szCell = 
2afb0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78  (u16*)&apCell[mx
2afc0 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20  CellPerPage];.  
2afd0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2afe0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
2aff0 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
2b000 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54  y empty */.    T
2b010 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2b020 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e  empty table %d\n
2b030 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
2b040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2b050 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2b060 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
2b070 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
2b080 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a  nsfer the.    **
2b090 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2b0a0 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64  m that one child
2b0b0 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70   into the root p
2b0c0 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a  age if it .    *
2b0d0 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
2b0e0 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
2b0f0 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
2b100 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  by one..    **. 
2b110 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f     ** If the roo
2b120 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  t page is page 1
2b130 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70  , it has less sp
2b140 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68  ace available th
2b150 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68  an.    ** its ch
2b160 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20  ild (due to the 
2b170 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20  100 byte header 
2b180 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
2b190 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
2b1a0 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
2b1b0 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
2b1c0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
2b1d0 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
2b1e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66   the .    ** inf
2b1f0 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
2b200 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
2b210 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
2b220 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20  his is the .    
2b230 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
2b240 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
2b250 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
2b260 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
2b270 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2b280 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f  right-pointer to
2b290 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
2b2a0 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65    The child page
2b2b0 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20   becomes.    ** 
2b2c0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2b2d0 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
2b2e0 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69    */.    pgnoChi
2b2f0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
2b300 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b310 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2b320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2b330 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20  noChild>0 );.   
2b340 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
2b350 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ld<=pagerPagecou
2b360 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  nt(pPage->pBt->p
2b370 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
2b380 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2b390 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42  etPage(pPage->pB
2b3a0 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70  t, pgnoChild, &p
2b3b0 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69  Child, 0);.    i
2b3c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2b3d0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2b3e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2b3f0 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
2b400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2b410 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
2b420 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20  ld, pPage);.    
2b430 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2b440 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2b450 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
2b460 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
2b470 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
2b480 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
2b490 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
2b4a0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2b4b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
2b4c0 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
2b4d0 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
2b4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
2b4f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2b500 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
2b510 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2b520 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
2b530 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2b540 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2b550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2b560 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
2b570 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
2b580 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2b590 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2b5a0 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
2b5b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
2b5c0 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
2b5d0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2b5e0 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
2b5f0 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
2b600 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2b610 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
2b620 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
2b630 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
2b640 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2b650 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b660 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
2b670 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
2b680 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
2b690 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
2b6a0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2b6b0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
2b6c0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
2b6d0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2b6e0 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
2b6f0 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
2b700 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2b710 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2b730 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
2b740 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
2b750 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2b760 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
2b770 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
2b780 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
2b790 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
2b7a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2b7b0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
2b7c0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
2b7d0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2b7e0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2b7f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b800 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
2b810 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
2b820 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
2b830 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
2b840 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
2b850 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  it = 0;.      pP
2b860 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
2b870 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2b880 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2b890 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2b8a0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2b8b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2b8c0 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2b8d0 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2b8e0 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2b8f0 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2b900 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2b910 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2b920 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2b930 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2b940 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
2b950 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65  ChildPages(pPage
2b960 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
2b970 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2b980 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ow==0 );.    if(
2b990 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2b9a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2b9b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2b9c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2b9d0 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ){ .        rc =
2b9e0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2b9f0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
2ba00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ba10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ba20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2ba30 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2ba40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ba50 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
2ba60 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
2ba70 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2ba80 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  nce:.  sqlite3_f
2ba90 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
2baa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2bab0 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
2bac0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
2bad0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
2bae0 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
2baf0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
2bb00 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
2bb10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
2bb20 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
2bb30 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
2bb40 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2bb50 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
2bb60 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
2bb70 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
2bb80 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
2bb90 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
2bba0 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
2bbb0 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
2bbc0 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
2bbd0 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
2bbe0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
2bbf0 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
2bc00 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
2bc30 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2bc40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2bc50 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
2bc60 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
2bc70 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
2bc80 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2bc90 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2bca0 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
2bcb0 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
2bcc0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2bcd0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
2bce0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
2bcf0 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
2bd00 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
2bd10 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
2bd20 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
2bd30 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2bd40 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
2bd50 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
2bd60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2bd70 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
2bd80 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
2bd90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2bda0 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
2bdb0 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
2bdc0 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
2bdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2bde0 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
2bdf0 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
2be00 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
2be10 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
2be20 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
2be30 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2be40 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d  low>0 );.  pBt =
2be50 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61   pPage->pBt;.  a
2be60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2be70 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2be80 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2be90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2bea0 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20  e(pBt, &pChild, 
2beb0 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67  &pgnoChild, pPag
2bec0 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69  e->pgno, 0);.  i
2bed0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2bee0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
2bef0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2bf00 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
2bf10 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c  Page) );.  usabl
2bf20 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2bf30 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20  bleSize;.  data 
2bf40 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2bf50 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2bf60 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b  drOffset;.  cbrk
2bf70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2bf80 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61  a[hdr+5]);.  cda
2bf90 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61  ta = pChild->aDa
2bfa0 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61  ta;.  memcpy(cda
2bfb0 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20  ta, &data[hdr], 
2bfc0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2bfd0 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
2bfe0 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  -hdr);.  memcpy(
2bff0 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64  &cdata[cbrk], &d
2c000 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
2c010 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 20 20 69  eSize-cbrk);.  i
2c020 66 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69  f( pChild->isIni
2c030 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
2c040 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 63 20  E_CORRUPT;.  rc 
2c050 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2c060 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
2c070 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2c080 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
2c090 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  eper_out;.  memc
2c0a0 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
2c0b0 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
2c0c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c0d0 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
2c0e0 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
2c0f0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2c100 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c110 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  w;.  if( pChild-
2c120 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2c130 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2c140 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2c150 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
2c160 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
2c170 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61  ;.  zeroPage(pPa
2c180 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2c190 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
2c1a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2c1b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2c1c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
2c1d0 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54   pgnoChild);.  T
2c1e0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2c1f0 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2c200 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2c210 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2c220 6e 6f 29 29 3b 0a 20 20 69 66 28 20 49 53 41 55  no));.  if( ISAU
2c230 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2c240 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d 20  int i;.    rc = 
2c250 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2c260 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52  Child->pgno, PTR
2c270 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65  MAP_BTREE, pPage
2c280 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
2c290 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2c2a0 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20  cedeeper_out;.  
2c2b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
2c2c0 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
2c2d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2c2e0 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c  mapPutOvfl(pChil
2c2f0 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  d, i);.      if(
2c300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c310 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62  {.        goto b
2c320 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2c330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c340 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
2c350 74 43 68 69 6c 64 50 61 67 65 73 28 70 43 68 69  tChildPages(pChi
2c360 6c 64 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  ld, 1);.  }.  if
2c370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c380 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  ){.    rc = bala
2c390 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69  nce_nonroot(pChi
2c3a0 6c 64 29 3b 0a 20 20 7d 0a 0a 62 61 6c 61 6e 63  ld);.  }..balanc
2c3b0 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
2c3c0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2c3d0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2c3e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
2c3f0 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
2c400 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
2c410 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
2c420 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
2c430 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
2c440 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
2c450 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
2c460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2c470 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
2c480 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
2c490 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2c4a0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2c4b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c4c0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2c4d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2c4e0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
2c4f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
2c500 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c510 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2c520 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2c530 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2c540 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
2c550 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2c560 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
2c570 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2c580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c590 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
2c5a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2c5b0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2c5c0 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
2c5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2c5e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c5f0 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
2c600 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
2c610 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
2c620 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2c630 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
2c640 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
2c650 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
2c660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2c680 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
2c690 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
2c6a0 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
2c6b0 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
2c6c0 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
2c6d0 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20  ors were opened 
2c6e0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69  with wrFlag==0 i
2c6f0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  n a different.**
2c700 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2c710 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65  tion (a database
2c720 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
2c730 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65   shares the page
2c740 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20  r.** cache with 
2c750 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e  the current conn
2c760 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74  ection) and that
2c770 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2c780 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20  n .** is not in 
2c790 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69  the ReadUncommmi
2c7a0 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e  tted state, then
2c7b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2c7c0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2c7d0 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41  _LOCKED..**.** A
2c7e0 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72  s well as cursor
2c7f0 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  s with wrFlag==0
2c800 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77  , cursors with w
2c810 72 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a  rFlag==1 and .**
2c820 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
2c830 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f  e==1 are also co
2c840 6e 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20  nsidered 'read' 
2c850 63 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65  cursors. Increme
2c860 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75  ntal .** blob cu
2c870 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66  rsors are used f
2c880 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
2c890 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a  and writing..**.
2c8a0 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74  ** When pgnoRoot
2c8b0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
2c8c0 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74  e of an intkey t
2c8d0 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  able, this funct
2c8e0 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ion is also.** r
2c8f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69  esponsible for i
2c900 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72  nvalidating incr
2c910 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
2c920 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61  sors when the ta
2c930 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68  ble row.** on wh
2c940 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65  ich they are ope
2c950 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f  ned is deleted o
2c960 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73  r modified. Curs
2c970 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
2c980 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
2c990 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2c9a0 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
2c9b0 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c   1) When BtreeCl
2c9c0 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61  earTable() is ca
2c9d0 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
2c9e0 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f  ly delete the co
2c9f0 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f  ntents.**      o
2ca00 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65  f a B-Tree table
2ca10 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
2ca20 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61  t to zero and pa
2ca30 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
2ca40 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20  .**      set to 
2ca50 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69  non-zero. In thi
2ca60 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65  s case all incre
2ca70 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2ca80 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20  ors open.**     
2ca90 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f   on the table ro
2caa0 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74  oted at pgnoRoot
2cab0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2cac0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
2cad0 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c  n BtreeInsert(),
2cae0 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
2caf0 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29  r BtreePutData()
2cb00 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a   is called to .*
2cb10 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20  *      modify a 
2cb20 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e  table row via an
2cb30 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
2cb40 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
2cb50 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  to the .**      
2cb60 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65  write cursor use
2cb70 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69  d to do the modi
2cb80 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72  fication and par
2cb90 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73  ameter iRow is s
2cba0 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  et.**      to th
2cbb0 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64  e integer row id
2cbc0 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65   of the B-Tree e
2cbd0 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66  ntry being modif
2cbe0 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20  ied. Unless.**  
2cbf0 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20      pExclude is 
2cc00 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d  itself an increm
2cc10 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2cc20 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72  r, then all incr
2cc30 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20  emental.**      
2cc40 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
2cc50 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66  n on row iRow of
2cc60 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20   the B-Tree are 
2cc70 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2cc80 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20  **   3) If both 
2cc90 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f  pExclude and iRo
2cca0 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  w are set to zer
2ccb0 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61  o, no incrementa
2ccc0 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20  l blob .**      
2ccd0 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
2cce0 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  lidated..*/.stat
2ccf0 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64  ic int checkRead
2cd00 4c 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a  Locks(.  Btree *
2cd10 70 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20  pBtree, .  Pgno 
2cd20 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43  pgnoRoot, .  BtC
2cd30 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c  ursor *pExclude,
2cd40 0a 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20  .  i64 iRow.){. 
2cd50 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
2cd60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2cd70 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73  pBtree->pBt;.  s
2cd80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
2cd90 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  ree->db;.  asser
2cda0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2cdb0 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
2cdc0 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
2cdd0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
2cde0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
2cdf0 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29  f( p==pExclude )
2ce00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2ce10 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
2ce20 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69  pgnoRoot ) conti
2ce30 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
2ce40 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2ce50 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  B.    if( p->isI
2ce60 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2ce70 20 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70   ( .         (!p
2ce80 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29  Exclude && iRow)
2ce90 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c  .      || (pExcl
2cea0 75 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65  ude && !pExclude
2ceb0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
2cec0 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le && p->info.nK
2ced0 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29  ey==iRow).    ))
2cee0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
2cef0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2cf00 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ID;.    }.#endif
2cf10 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
2cf20 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2cf30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cf40 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d   if( p->wrFlag==
2cf50 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0 .#ifndef SQLIT
2cf60 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2cf70 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63       || p->isInc
2cf80 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64  rblobHandle.#end
2cf90 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  if.    ){.      
2cfa0 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
2cfb0 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62   = p->pBtree->db
2cfc0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74  ;.      if( dbOt
2cfd0 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  her==0 ||.      
2cfe0 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20     (dbOther!=db 
2cff0 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61  && (dbOther->fla
2d000 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
2d010 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29  Uncommitted)==0)
2d020 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2d030 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2d040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2d060 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2d070 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
2d080 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
2d090 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
2d0a0 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
2d0b0 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
2d0c0 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
2d0d0 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
2d0e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2d0f0 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
2d100 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
2d110 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
2d120 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
2d130 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
2d140 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
2d150 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
2d160 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
2d170 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
2d180 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
2d190 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
2d1a0 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
2d1b0 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
2d1c0 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
2d1d0 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
2d1e0 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
2d1f0 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
2d200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2d210 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
2d220 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d240 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
2d250 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
2d260 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
2d270 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2d280 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2d290 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
2d2a0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2d2b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2d2c0 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
2d2d0 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
2d2e0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
2d2f0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d310 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
2d320 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61  tra 0 bytes to a
2d330 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
2d340 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
2d350 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2d360 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2d370 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61  s is likely an a
2d380 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ppend */.){.  in
2d390 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b  t rc;.  int loc;
2d3a0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
2d3b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2d3c0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
2d3d0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
2d3e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2d3f0 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
2d400 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20  char *oldCell;. 
2d410 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d420 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20  newCell = 0;..  
2d430 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2d440 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2d450 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
2d460 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
2d470 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
2d480 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
2d490 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
2d4a0 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72  e doing an inser
2d4b0 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42  t */.    rc = pB
2d4c0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2d4d0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2d4e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2d4f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2d500 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
2d510 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69  >readOnly );.  i
2d520 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
2d530 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d540 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
2d550 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e   Cursor not open
2d560 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a   for writing */.
2d570 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52    }.  if( checkR
2d580 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70  eadLocks(pCur->p
2d590 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e  Btree, pCur->pgn
2d5a0 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65  oRoot, pCur, nKe
2d5b0 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
2d5c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2d5d0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2d5e0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2d5f0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2d600 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
2d610 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
2d620 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
2d630 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
2d640 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
2d650 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2d660 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2d670 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
2d680 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72  le */.  clearCur
2d690 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2d6a0 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51  );.  if( .    SQ
2d6b0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2d6c0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2d6d0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2d6e0 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20  t, pCur)) ||.   
2d6f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2d700 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2d710 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
2d720 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
2d730 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20  s, &loc)).  ){. 
2d740 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d750 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2d760 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2d770 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2d780 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  y || nKey>=0 );.
2d790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d7a0 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d  >leaf || !pPage-
2d7b0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41  >intKey );.  TRA
2d7c0 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62  CE(("INSERT: tab
2d7d0 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20  le=%d nkey=%lld 
2d7e0 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64  ndata=%d page=%d
2d7f0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
2d800 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2d810 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70  , nKey, nData, p
2d820 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20  Page->pgno,.    
2d830 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22        loc==0 ? "
2d840 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65  overwrite" : "ne
2d850 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73  w entry"));.  as
2d860 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2d870 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74  nit );.  allocat
2d880 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
2d890 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74  .  newCell = pBt
2d8a0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69  ->pTmpSpace;.  i
2d8b0 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
2d8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d8d0 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
2d8e0 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
2d8f0 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
2d900 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
2d910 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b   nZero, &szNew);
2d920 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2d930 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61   end_insert;.  a
2d940 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65  ssert( szNew==ce
2d950 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2d960 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61   newCell) );.  a
2d970 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58  ssert( szNew<=MX
2d980 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2d990 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  );.  if( loc==0 
2d9a0 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  && CURSOR_VALID=
2d9b0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2d9c0 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a  .    u16 szOld;.
2d9d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d9e0 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
2d9f0 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
2da00 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
2da10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2da20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2da30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2da40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
2da50 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
2da60 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
2da70 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2da80 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21  >idx);.    if( !
2da90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2daa0 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
2dab0 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
2dac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
2dad0 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
2dae0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
2daf0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2db00 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
2db10 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2db20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2db30 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  t;.    dropCell(
2db40 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2db50 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  , szOld);.  }els
2db60 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
2db70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
2db80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2db90 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
2dba0 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20  pCur->idx++;.   
2dbb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2dbc0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2dbd0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
2dbe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2dbf0 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2dc00 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69   );.  }.  rc = i
2dc10 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
2dc20 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43   pCur->idx, newC
2dc30 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
2dc40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2dc50 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2dc60 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d  d_insert;.  rc =
2dc70 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2dc80 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
2dc90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
2dca0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2dcb0 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a  .  }.end_insert:
2dcc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dcd0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2dce0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2dcf0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2dd00 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2dd10 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2dd20 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2dd30 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2dd40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2dd50 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2dd60 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2dd70 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2dd80 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2dd90 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2dda0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2ddb0 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2ddc0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2ddd0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2dde0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2ddf0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2de00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2de10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2de20 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2de30 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  it );.  if( pBt-
2de40 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2de50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2de60 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2de70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2de80 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65  efore doing a de
2de90 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  lete */.    rc =
2dea0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2deb0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2dec0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2ded0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2dee0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2def0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2df00 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2df10 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2df20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2df30 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20  Cur->skip;.  }. 
2df40 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e   if( pCur->idx >
2df50 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  = pPage->nCell )
2df60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2df70 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
2df80 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2df90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
2dfa0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2dfb0 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
2dfc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2dfd0 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
2dfe0 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68   Did not open th
2dff0 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72  is cursor for wr
2e000 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
2e010 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
2e020 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCur->pBtree, 
2e030 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2e040 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f  pCur, pCur->info
2e050 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65  .nKey) ){.    re
2e060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2e070 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2e080 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2e090 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2e0a0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2e0b0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2e0c0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2e0d0 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2e0e0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2e0f0 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2e100 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2e110 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2e120 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2e130 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2e140 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2e150 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2e160 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2e170 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2e180 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2e190 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2e1a0 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2e1b0 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2e1c0 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72  (rc = restoreCur
2e1d0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2e1e0 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2e1f0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
2e200 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2e210 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30  oRoot, pCur))!=0
2e220 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71   ||.    (rc = sq
2e230 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e240 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2e250 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
2e260 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2e270 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
2e280 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67  l within its pag
2e290 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c  e and leave pCel
2e2a0 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  l pointing to th
2e2b0 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65  e.  ** data. The
2e2c0 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c   clearCell() cal
2e2d0 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72  l frees any over
2e2e0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
2e2f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
2e300 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65   ** cell. The ce
2e310 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69  ll itself is sti
2e320 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a  ll intact..  */.
2e330 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2e340 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2e350 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61  idx);.  if( !pPa
2e360 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e370 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
2e380 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d  byte(pCell);.  }
2e390 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c  .  rc = clearCel
2e3a0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
2e3b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2e3c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e3d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2e3e0 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  eaf ){.    /*.  
2e3f0 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77    ** The entry w
2e400 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64  e are about to d
2e410 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c  elete is not a l
2e420 65 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20  eaf so if we do 
2e430 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f  not.    ** do so
2e440 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20  mething we will 
2e450 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20  leave a hole on 
2e460 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65  an internal page
2e470 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65  ..    ** We have
2e480 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c   to fill the hol
2e490 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61  e by moving in a
2e4a0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2e4b0 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e  f.  The.    ** n
2e4c0 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74  ext Cell after t
2e4d0 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c  he one to be del
2e4e0 65 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65  eted is guarante
2e4f0 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a  ed to exist and.
2e500 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c      ** to be a l
2e510 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73  eaf so we can us
2e520 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
2e530 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75   BtCursor leafCu
2e540 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  r;.    unsigned 
2e550 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20  char *pNext;.   
2e560 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
2e570 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e580 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20  *tempCell = 0;. 
2e590 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2e5a0 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
2e5b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2e5c0 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2e5d0 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2e5e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2e5f0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2e600 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2e610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e620 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2e630 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e640 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2e650 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2e660 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
2e680 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20  16 szNext;.     
2e690 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2e6a0 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2e6b0 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25   internal from %
2e6c0 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c  d replace from l
2e6d0 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
2e6e0 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2e6f0 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ot, pPage->pgno,
2e700 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e   leafCur.pPage->
2e710 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72  pgno));.      dr
2e720 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
2e730 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ur->idx, cellSiz
2e740 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2e750 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
2e760 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66   = findCell(leaf
2e770 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43  Cur.pPage, leafC
2e780 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73  ur.idx);.      s
2e790 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65  zNext = cellSize
2e7a0 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67  Ptr(leafCur.pPag
2e7b0 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  e, pNext);.     
2e7c0 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
2e7d0 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65  _SIZE(pBt)>=szNe
2e7e0 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c  xt+4 );.      al
2e7f0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
2e800 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  pBt);.      temp
2e810 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
2e820 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28  Space;.      if(
2e830 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
2e840 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2e850 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2e860 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
2e870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e880 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2e890 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2e8a0 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  r->idx, pNext-4,
2e8b0 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2e8c0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ell, 0);.      }
2e8d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e8f0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2e900 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2e910 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c  age, pCur->idx),
2e920 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
2e930 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2e940 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2e950 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2e960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e970 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2e980 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2e990 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e  leafCur.idx, szN
2e9a0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ext);.        rc
2e9b0 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43   = balance(leafC
2e9c0 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ur.pPage, 0);.  
2e9d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e9e0 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
2e9f0 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c  aseTempCursor(&l
2ea00 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  eafCur);.  }else
2ea10 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45  {.    TRACE(("DE
2ea20 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
2ea30 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20  elete from leaf 
2ea40 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %d\n",.       pC
2ea50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2ea60 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2ea70 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2ea80 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c   pCur->idx, cell
2ea90 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2eaa0 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d  Cell));.    rc =
2eab0 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2eac0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
2ead0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2eae0 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
2eaf0 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
2eb00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
2eb10 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
2eb20 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
2eb30 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
2eb40 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
2eb50 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
2eb60 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
2eb70 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
2eb80 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
2eb90 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
2eba0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2ebb0 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
2ebc0 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
2ebd0 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
2ebe0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
2ebf0 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
2ec00 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
2ec10 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
2ec20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
2ec30 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
2ec40 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
2ec50 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
2ec60 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
2ec70 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
2ec90 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
2eca0 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces.*/.static in
2ecb0 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  t btreeCreateTab
2ecc0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2ecd0 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
2ece0 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
2ecf0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2ed00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
2ed10 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
2ed20 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ot;.  int rc;.. 
2ed30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ed40 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2ed50 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  p) );.  if( pBt-
2ed60 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2ed70 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2ed80 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2ed90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
2eda0 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d  irst */.    rc =
2edb0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2edc0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2edd0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2ede0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2edf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2ee00 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2ee10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2ee20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ee30 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2ee40 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
2ee50 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
2ee60 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  1, 0);.  if( rc 
2ee70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2ee80 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66  ;.  }.#else.  if
2ee90 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2eea0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
2eeb0 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
2eec0 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
2eed0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2eee0 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2eef0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2ef00 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
2ef10 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
2ef20 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72  o. */..    /* Cr
2ef30 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  eating a new tab
2ef40 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20  le may probably 
2ef50 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
2ef60 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
2ef70 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ase.    ** to ma
2ef80 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2ef90 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20  new tables root 
2efa0 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68  page. In case th
2efb0 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20  is page turns.  
2efc0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61    ** out to be a
2efd0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
2efe0 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72   delete all over
2eff0 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61  flow page-map ca
2f000 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64  ches.    ** held
2f010 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   by open cursors
2f020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76  ..    */.    inv
2f030 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
2f040 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20  owCache(pBt);.. 
2f050 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
2f060 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
2f070 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2f080 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
2f090 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
2f0a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2f0b0 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
2f0c0 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
2f0d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2f0e0 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
2f0f0 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
2f100 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
2f110 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
2f120 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2f130 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2f140 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67  etMeta(p, 4, &pg
2f150 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
2f160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f170 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2f180 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e  c;.    }.    pgn
2f190 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  oRoot++;..    /*
2f1a0 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   The new root-pa
2f1b0 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  ge may not be al
2f1c0 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69  located on a poi
2f1d0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f  nter-map page, o
2f1e0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e  r the.    ** PEN
2f1f0 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a  DING_BYTE page..
2f200 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
2f210 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
2f220 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
2f230 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
2f240 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
2f250 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2f260 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
2f270 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
2f280 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2f290 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
2f2a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
2f2b0 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
2f2c0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
2f2d0 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
2f2e0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
2f2f0 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
2f300 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
2f310 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
2f320 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
2f330 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
2f340 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
2f350 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
2f360 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2f370 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2f380 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2f390 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2f3a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f3b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2f3c0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2f3d0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2f3e0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
2f3f0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
2f400 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
2f410 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
2f420 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
2f430 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
2f440 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
2f450 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
2f460 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
2f470 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
2f480 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
2f490 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
2f4a0 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
2f4b0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2f4c0 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
2f4d0 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
2f4e0 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
2f4f0 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
2f500 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
2f510 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
2f520 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
2f530 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
2f540 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
2f550 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f560 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
2f570 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
2f580 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
2f590 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
2f5a0 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
2f5b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f5c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2f5d0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2f5e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2f5f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f600 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f610 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2f620 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2f630 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2f640 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
2f650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2f660 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54  =SQLITE_OK || eT
2f670 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
2f680 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  PAGE || eType==P
2f690 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2f6a0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2f6b0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2f6c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2f6e0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2f6f0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
2f700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2f710 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45  Type!=PTRMAP_FRE
2f720 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72  EPAGE );.      r
2f730 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f740 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
2f750 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2f760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f770 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2f780 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2f790 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2f7b0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
2f7c0 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79  (pBt, pRoot, eTy
2f7d0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67  pe, iPtrPage, pg
2f7e0 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  noMove, 0);.    
2f7f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f800 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oot);..      /* 
2f810 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 20  Obtain the page 
2f820 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20  at pgnoRoot */. 
2f830 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f860 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2f870 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2f880 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
2f890 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
2f8a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f8b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f8d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2f8e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f8f0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2f900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2f910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f920 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f930 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2f940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f950 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2f960 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50        pRoot = pP
2f970 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a  ageMove;.    } .
2f980 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
2f990 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61  he pointer-map a
2f9a0 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74  nd meta-data wit
2f9b0 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  h the new root-p
2f9c0 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20  age number. */. 
2f9d0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2f9e0 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2f9f0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2fa00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2fa10 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2fa20 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2fa30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fa40 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
2fa50 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
2fa60 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52  Meta(p, 4, pgnoR
2fa70 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
2fa80 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2fa90 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2faa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fab0 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
2fac0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2fad0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2fae0 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
2faf0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
2fb00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2fb10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
2fb20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2fb30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52  erIswriteable(pR
2fb40 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  oot->pDbPage) );
2fb50 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
2fb60 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c  t, flags | PTF_L
2fb70 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  EAF);.  sqlite3P
2fb80 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d  agerUnref(pRoot-
2fb90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69  >pDbPage);.  *pi
2fba0 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e  Table = (int)pgn
2fbb0 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  oRoot;.  return 
2fbc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
2fbd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
2fbe0 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2fbf0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2fc00 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
2fc10 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2fc20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2fc30 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
2fc40 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
2fc50 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20  eCreateTable(p, 
2fc60 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b  piTable, flags);
2fc70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2fc80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2fc90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2fca0 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64  rase the given d
2fcb0 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64  atabase page and
2fcc0 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65   all its childre
2fcd0 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  n.  Return.** th
2fce0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
2fcf0 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  eelist..*/.stati
2fd00 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62  c int clearDatab
2fd10 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  asePage(.  BtSha
2fd20 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2fd30 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
2fd40 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2fd50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  he table */.  Pg
2fd60 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
2fd70 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2fd80 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20  er to clear */. 
2fd90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2fda0 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  t,     /* Parent
2fdb0 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72   page.  NULL for
2fdc0 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69   the root */.  i
2fdd0 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  nt freePageFlag 
2fde0 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61       /* Dealloca
2fdf0 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20  te page if true 
2fe00 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
2fe10 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
2fe20 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
2fe30 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2fe40 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
2fe50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2fe60 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2fe70 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70   );.  if( pgno>p
2fe80 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
2fe90 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
2fea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2feb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2fec0 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  }..  rc = getAnd
2fed0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2fee0 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72  no, &pPage, pPar
2fef0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
2ff00 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2ff10 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66  asepage_out;.  f
2ff20 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
2ff30 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2ff40 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2ff50 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
2ff60 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ff70 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2ff80 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2ff90 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2ffa0 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20  (pCell), pPage, 
2ffb0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
2ffc0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2ffd0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2ffe0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
2fff0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
30000 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
30010 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
30020 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
30030 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
30040 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
30050 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
30060 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
30070 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
30080 5b 38 5d 29 2c 20 70 50 61 67 65 2c 20 31 29 3b  [8]), pPage, 1);
30090 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
300a0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
300b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
300c0 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
300d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
300e0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
300f0 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
30100 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30110 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30120 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
30130 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
30140 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
30150 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
30160 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
30170 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
30180 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
30190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
301a0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
301b0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
301c0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
301d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
301e0 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
301f0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
30200 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
30210 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
30220 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
30230 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
30240 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
30250 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
30260 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
30270 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
30280 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
30290 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
302a0 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
302b0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
302c0 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
302d0 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
302e0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
302f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
30300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30310 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
30320 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
30330 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
30340 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30350 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
30360 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
30370 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
30380 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  b;.  if( p->inTr
30390 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
303a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
303b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
303c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
303d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
303e0 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63  else if( (rc = c
303f0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
30400 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21   iTable, 0, 1))!
30410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30420 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
30430 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  do */.  }else if
30440 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
30450 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
30460 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30  s(pBt, iTable, 0
30470 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  )) ){.    /* not
30480 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
30490 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
304a0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
304b0 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
304c0 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ble, 0, 0);.  }.
304d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
304e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
304f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
30500 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
30510 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
30520 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
30530 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
30540 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
30550 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
30560 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
30570 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
30580 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
30590 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
305a0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
305b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
305c0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
305d0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
305e0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
305f0 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
30600 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
30610 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
30620 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
30630 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
30640 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
30650 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
30660 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
30670 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
30680 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
30690 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
306a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
306b0 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
306c0 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
306d0 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
306e0 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
306f0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
30700 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
30710 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
30720 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
30730 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
30740 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
30750 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
30760 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
30770 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
30780 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
30790 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
307a0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
307b0 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
307c0 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
307d0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
307e0 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
307f0 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
30800 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
30810 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
30820 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
30830 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
30840 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
30850 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
30860 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
30870 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
30880 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
30890 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
308a0 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
308b0 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
308c0 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
308d0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
308e0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
308f0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
30900 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
30910 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
30920 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
30930 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
30940 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
30950 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
30960 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
30970 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
30980 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
30990 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
309a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
309b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
309c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
309d0 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
309e0 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
309f0 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
30a00 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
30a10 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
30a20 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
30a30 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
30a40 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
30a50 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
30a60 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
30a70 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
30a80 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
30a90 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
30aa0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
30ab0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
30ac0 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
30ad0 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
30ae0 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
30af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
30b00 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
30b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
30b20 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
30b30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
30b40 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
30b50 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
30b60 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
30b70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
30b80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
30b90 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
30ba0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  le);.  if( rc ){
30bb0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
30bc0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
30bd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
30be0 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
30bf0 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
30c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
30c10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30c20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
30c30 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
30c40 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
30c50 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
30c60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
30c70 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
30c80 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
30c90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
30ca0 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d  GetMeta(p, 4, &m
30cb0 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
30cc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30cd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30ce0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30cf0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
30d00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
30d10 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
30d20 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
30d30 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
30d40 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
30d50 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
30d60 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
30d70 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
30d80 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
30d90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30da0 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
30db0 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
30dc0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
30dd0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
30de0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
30df0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30e00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30e10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30e30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
30e50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
30e60 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
30e70 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
30e80 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
30e90 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
30ea0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
30eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
30ec0 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
30ed0 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
30ee0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
30ef0 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
30f00 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
30f10 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30f20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
30f30 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
30f40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30f50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30f60 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
30f70 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
30f80 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
30f90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30fb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30fd0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
30fe0 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
30ff0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
31000 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29  E, 0, iTable, 0)
31010 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
31020 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
31030 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31050 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31080 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31090 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
310a0 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
310b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
310c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
310d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
310e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
310f0 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
31100 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
31110 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
31120 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31140 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31160 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
31170 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
31180 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
31190 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
311a0 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
311b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
311c0 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
311d0 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
311e0 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
311f0 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
31200 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
31210 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
31220 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
31230 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
31240 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
31250 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
31260 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
31270 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
31280 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
31290 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
312a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
312b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
312c0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
312d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
312e0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
312f0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
31300 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
31310 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
31320 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
31330 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
31340 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
31350 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31360 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
31370 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
31380 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
31390 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
313a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
313b0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
313c0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
313d0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
313e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
313f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
31400 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
31410 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
31420 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
31430 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
31440 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
31450 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
31460 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31480 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
31490 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
314a0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
314b0 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
314c0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
314d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
314e0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
314f0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
31500 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62  c = btreeDropTab
31510 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69  le(p, iTable, pi
31520 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  Moved);.  sqlite
31530 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
31540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31550 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
31560 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
31570 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61   out of a databa
31580 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30  se file.  Meta[0
31590 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62  ].** is the numb
315a0 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  er of free pages
315b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
315c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
315d0 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20  a[1].** through 
315e0 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61  meta[15] are ava
315f0 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  ilable for use b
31600 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e  y higher layers.
31610 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
31620 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f  read-only, the o
31630 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77  thers are read/w
31640 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  rite..** .** The
31650 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75   schema layer nu
31660 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65  mbers meta value
31670 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20  s differently.  
31680 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  At the schema.**
31690 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20   layer (and the 
316a0 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65  SetCookie and Re
316b0 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73  adCookie opcodes
316c0 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  ) the number of.
316d0 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73  ** free pages is
316e0 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53   not visible.  S
316f0 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74  o Cookie[0] is t
31700 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b  he same as Meta[
31710 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  1]..*/.int sqlit
31720 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42  e3BtreeGetMeta(B
31730 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
31740 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20  , u32 *pMeta){. 
31750 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
31760 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
31770 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
31780 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
31790 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
317a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
317b0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
317c0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65   p->db;..  /* Re
317d0 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74  ading a meta-dat
317e0 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73  a value requires
317f0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
31800 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63  page 1 (and henc
31810 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  e.  ** the sqlit
31820 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
31830 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63  We grab this loc
31840 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  k regardless of 
31850 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20  whether or.  ** 
31860 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52  not the SQLITE_R
31870 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
31880 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20  lag is set (the 
31890 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
318a0 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74  page.  ** 1 is t
318b0 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63  reated as a spec
318c0 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72  ial case by quer
318d0 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64  yTableLock() and
318e0 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20   lockTable()).. 
318f0 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
31900 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20  TableLock(p, 1, 
31910 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
31920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31930 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
31940 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
31950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
31960 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
31970 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  0 && idx<=15 );.
31980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31990 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
319a0 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29  er, 1, &pDbPage)
319b0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
319c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
319d0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
319e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
319f0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
31a00 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
31a10 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
31a20 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74  ;.  *pMeta = get
31a30 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
31a40 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74  idx*4]);.  sqlit
31a50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
31a60 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Page);..  /* If 
31a70 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20  autovacuumed is 
31a80 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73  disabled in this
31a90 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72   build but we ar
31aa0 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a  e trying to .  *
31ab0 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f  * access an auto
31ac0 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73  vacuumed databas
31ad0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65  e, then make the
31ae0 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e   database readon
31af0 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ly. .  */.#ifdef
31b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31b10 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64  OVACUUM.  if( id
31b20 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30  x==4 && *pMeta>0
31b30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   ) pBt->readOnly
31b40 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 1;.#endif..  
31b50 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61 64  /* Grab the read
31b60 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e  -lock on page 1.
31b70 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54   */.  rc = lockT
31b80 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f  able(p, 1, READ_
31b90 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
31ba0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
31bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31bc0 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d  *.** Write meta-
31bd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b  information back
31be0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
31bf0 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a  se.  Meta[0] is.
31c00 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  ** read-only and
31c10 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74   may not be writ
31c20 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ten..*/.int sqli
31c30 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
31c40 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
31c50 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29   idx, u32 iMeta)
31c60 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
31c70 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
31c80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
31c90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
31ca0 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20  sert( idx>=1 && 
31cb0 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c  idx<=15 );.  sql
31cc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
31cd0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
31ce0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69  ->db;.  if( p->i
31cf0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
31d00 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
31d10 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
31d20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
31d30 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
31d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
31d50 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
31d60 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20 3d  !=0 );.    pP1 =
31d70 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
31d80 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ata;.    rc = sq
31d90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31da0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
31db0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31dd0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31de0 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c  pP1[36 + idx*4],
31df0 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66   iMeta);.#ifndef
31e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31e10 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
31e20 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20  ( idx==7 ){.    
31e30 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
31e40 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69  >autoVacuum || i
31e50 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Meta==0 );.     
31e60 20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74 61     assert( iMeta
31e70 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20  ==0 || iMeta==1 
31e80 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
31e90 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 4d 65  incrVacuum = iMe
31ea0 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ta;.      }.#end
31eb0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  if.    }.  }.  s
31ec0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
31ed0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
31ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
31ef0 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20  n the flag byte 
31f00 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
31f10 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
31f20 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
31f30 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
31f40 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
31f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
31f60 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
31f70 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
31f80 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52  hat about CURSOR
31f90 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
31fa0 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65  te? Probably nee
31fb0 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72  d to call.  ** r
31fc0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
31fd0 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a  tion() here..  *
31fe0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
31ff0 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75 72  ge;.  restoreCur
32000 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
32010 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
32020 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
32030 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
32040 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
32050 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
32060 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b  Bt==pCur->pBt );
32070 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 20  .  return pPage 
32080 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  ? pPage->aData[p
32090 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d  Page->hdrOffset]
320a0 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   : 0;.}.../*.** 
320b0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72  Return the pager
320c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
320d0 20 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20   a BTree.  This 
320e0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
320f0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
32100 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
32110 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c  y..*/.Pager *sql
32120 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42  ite3BtreePager(B
32130 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
32140 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  rn p->pBt->pPage
32150 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  r;.}..#ifndef SQ
32160 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
32170 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
32180 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65  Append a message
32190 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65   to the error me
321a0 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  ssage string..*/
321b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
321c0 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49  ckAppendMsg(.  I
321d0 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
321e0 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ck,.  char *zMsg
321f0 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
32200 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a  *zFormat,.  ....
32210 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
32220 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e  .  if( !pCheck->
32230 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  mxErr ) return;.
32240 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d    pCheck->mxErr-
32250 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72  -;.  pCheck->nEr
32260 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  r++;.  va_start(
32270 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
32280 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d  if( pCheck->errM
32290 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20  sg.nChar ){.    
322a0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
322b0 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65  ppend(&pCheck->e
322c0 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29 3b  rrMsg, "\n", 1);
322d0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67 31  .  }.  if( zMsg1
322e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
322f0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70  trAccumAppend(&p
32300 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 7a  Check->errMsg, z
32310 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20  Msg1, -1);.  }. 
32320 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66   sqlite3VXPrintf
32330 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
32340 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  , 1, zFormat, ap
32350 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
32360 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65  .  if( pCheck->e
32370 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61 69 6c  rrMsg.mallocFail
32380 65 64 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b  ed ){.    pCheck
32390 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
323a0 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   1;.  }.}.#endif
323b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
323c0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
323d0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
323e0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
323f0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64  Y_CHECK./*.** Ad
32400 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72  d 1 to the refer
32410 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
32420 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74  age iPage.  If t
32430 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
32440 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  d.** reference t
32450 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20  o the page, add 
32460 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
32470 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72   to pCheck->zErr
32480 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  Msg..** Return 1
32490 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20   if there are 2 
324a0 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e  ore more referen
324b0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
324c0 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74  and 0 if.** if t
324d0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
324e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
324f0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e page..**.** Al
32500 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  so check that th
32510 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
32520 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73   in bounds..*/.s
32530 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
32540 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  ef(IntegrityCk *
32550 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67  pCheck, int iPag
32560 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
32570 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
32580 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
32590 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
325a0 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67  k->nPage || iPag
325b0 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  e<0 ){.    check
325c0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
325d0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
325e0 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
325f0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
32600 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
32610 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
32620 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
32630 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
32640 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
32650 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
32660 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
32670 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
32680 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
32690 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
326a0 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
326b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
326c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
326d0 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
326e0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
326f0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
32700 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
32710 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
32720 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
32730 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
32740 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
32750 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
32760 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
32770 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
32780 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
32790 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
327a0 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
327b0 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
327c0 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
327d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
327e0 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
327f0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32810 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
32820 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
32830 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
32840 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
32850 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
32860 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
32870 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
32880 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
32890 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
328a0 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
328b0 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
328c0 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
328d0 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
328e0 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
328f0 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
32900 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
32910 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
32920 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
32930 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
32940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32950 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32960 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32970 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65  t, "Failed to re
32980 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64  ad ptrmap key=%d
32990 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ", iChild);.    
329a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
329b0 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d  f( ePtrmapType!=
329c0 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70  eType || iPtrmap
329d0 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20  Parent!=iParent 
329e0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
329f0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32a00 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22  ontext, .      "
32a10 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72  Bad ptr map entr
32a20 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65  y key=%d expecte
32a30 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25  d=(%d,%d) got=(%
32a40 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69  d,%d)", .      i
32a50 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50  Child, eType, iP
32a60 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79  arent, ePtrmapTy
32a70 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e  pe, iPtrmapParen
32a80 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
32a90 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
32aa0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
32ab0 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f  he freelist or o
32ac0 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
32ad0 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69  ge list..** Veri
32ae0 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
32af0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
32b00 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f  he list is N..*/
32b10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
32b20 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72  ckList(.  Integr
32b30 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
32b40 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
32b50 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  cking context */
32b60 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73  .  int isFreeLis
32b70 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t,       /* True
32b80 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e   for a freelist.
32b90 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72    False for over
32ba0 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a  flow page list *
32bb0 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
32bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
32bd0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  e number for fir
32be0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  st page in the l
32bf0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ist */.  int N, 
32c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c10 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
32c20 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
32c30 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  e list */.  char
32c40 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
32c50 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
32c60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
32c70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
32c80 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20   int expected = 
32c90 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  N;.  int iFirst 
32ca0 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65  = iPage;.  while
32cb0 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68  ( N-- > 0 && pCh
32cc0 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20  eck->mxErr ){.  
32cd0 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50    DbPage *pOvflP
32ce0 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  age;.    unsigne
32cf0 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74  d char *pOvflDat
32d00 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  a;.    if( iPage
32d10 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  <1 ){.      chec
32d20 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
32d30 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
32d40 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20        "%d of %d 
32d50 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72  pages missing fr
32d60 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  om overflow list
32d70 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22   starting at %d"
32d80 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c  ,.          N+1,
32d90 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73   expected, iFirs
32da0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
32db0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
32dc0 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
32dd0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
32de0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
32df0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
32e00 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72  t(pCheck->pPager
32e10 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
32e20 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20  pOvflPage) ){.  
32e30 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32e40 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
32e50 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ext, "failed to 
32e60 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50  get page %d", iP
32e70 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  age);.      brea
32e80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76  k;.    }.    pOv
32e90 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e  flData = (unsign
32ea0 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
32eb0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f  3PagerGetData(pO
32ec0 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66  vflPage);.    if
32ed0 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a  ( isFreeList ){.
32ee0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65        int n = ge
32ef0 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
32f00 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  a[4]);.#ifndef S
32f10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32f20 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
32f30 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
32f40 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
32f50 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
32f60 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54  Check, iPage, PT
32f70 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
32f80 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
32f90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32fa0 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e    if( n>pCheck->
32fb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
32fc0 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 63  4-2 ){.        c
32fd0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32fe0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
32ff0 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65             "free
33000 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20  list leaf count 
33010 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20  too big on page 
33020 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
33030 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20       N--;.      
33040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
33050 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
33060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  ){.          Pgn
33070 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65  o iFreePage = ge
33080 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
33090 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64  a[8+i*4]);.#ifnd
330a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
330b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
330c0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
330d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
330e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
330f0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
33100 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54  k, iFreePage, PT
33110 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
33120 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
33130 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
33140 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52            checkR
33150 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ef(pCheck, iFree
33160 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
33170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33180 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20     N -= n;.     
33190 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
331a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
331b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65  OVACUUM.    else
331c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
331d0 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70  is database supp
331e0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
331f0 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f   and iPage is no
33200 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  t the last.     
33210 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
33220 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20   overflow list, 
33230 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
33240 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
33250 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
33260 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65  e following page
33270 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a   matches iPage..
33280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
33290 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
332a0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e  autoVacuum && N>
332b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
332c0 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
332d0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ata);.        ch
332e0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
332f0 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
33300 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
33310 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
33320 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
33330 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
33340 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
33350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
33360 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b  nref(pOvflPage);
33370 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
33380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
33390 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
333a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
333b0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
333c0 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61  HECK./*.** Do va
333d0 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65  rious sanity che
333e0 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  cks on a single 
333f0 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20  page of a tree. 
33400 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74   Return.** the t
33410 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74  ree depth.  Root
33420 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e   pages return 0.
33430 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f    Parents of roo
33440 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72  t pages.** retur
33450 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  n 1, and so fort
33460 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20  h..** .** These 
33470 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a  checks are done:
33480 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20  .**.**      1.  
33490 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63  Make sure that c
334a0 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f  ells and freeblo
334b0 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c  cks do not overl
334c0 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62  ap.**          b
334d0 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f  ut combine to co
334e0 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74  mpletely cover t
334f0 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20  he page..**  NO 
33500 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63   2.  Make sure c
33510 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20  ell keys are in 
33520 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33  order..**  NO  3
33530 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
33540 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  key is less than
33550 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f   or equal to zLo
33560 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f  werBound..**  NO
33570 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    4.  Make sure 
33580 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65  no key is greate
33590 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
335a0 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a  to zUpperBound..
335b0 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63  **      5.  Chec
335c0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
335d0 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
335e0 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52  s..**      6.  R
335f0 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20  ecursively call 
33600 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e  checkTreePage on
33610 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a   all children..*
33620 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66  *      7.  Verif
33630 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68  y that the depth
33640 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
33650 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a   is the same..**
33660 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73        8.  Make s
33670 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73  ure this page is
33680 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75   at least 33% fu
33690 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  ll or else it is
336a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65  .**          the
336b0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
336c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
336d0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a   checkTreePage(.
336e0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
336f0 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65  Check,  /* Conte
33700 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74  xt for the sanit
33710 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  y check */.  int
33720 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
33730 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
33740 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
33750 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50   check */.  MemP
33760 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
33770 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
33780 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72   */.  char *zPar
33790 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50  entContext  /* P
337a0 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f  arent context */
337b0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
337c0 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72  Page;.  int i, r
337d0 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67  c, depth, d2, pg
337e0 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68  no, cnt;.  int h
337f0 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20  dr, cellStart;. 
33800 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38   int nCell;.  u8
33810 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72   *data;.  BtShar
33820 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75  ed *pBt;.  int u
33830 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61  sableSize;.  cha
33840 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b  r zContext[100];
33850 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20  .  char *hit;.. 
33860 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33870 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
33880 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50  t), zContext, "P
33890 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
338a0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
338b0 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
338c0 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
338d0 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
338e0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
338f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
33900 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
33910 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
33920 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
33930 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
33940 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
33950 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73  0;.  if( (rc = s
33960 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
33970 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
33980 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
33990 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
339a0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
339b0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
339c0 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65     "unable to ge
339d0 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f  t the page. erro
339e0 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b  r code=%d", rc);
339f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
33a00 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73   }.  if( (rc = s
33a10 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
33a20 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
33a30 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt))!=0 ){.    c
33a40 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
33a50 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
33a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33a70 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65      "sqlite3Btre
33a80 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  eInitPage() retu
33a90 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
33aa0 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
33ab0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
33ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
33ad0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
33ae0 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
33af0 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
33b00 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
33b10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
33b20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
33b30 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
33b40 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
33b50 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
33b60 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
33b70 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
33b80 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
33b90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
33ba0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
33bb0 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
33bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f  .             "O
33bd0 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
33be0 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
33bf0 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
33c00 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
33c10 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,i);.    sqlite3
33c20 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
33c30 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
33c40 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
33c50 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
33c60 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
33c70 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f  Key ) sz += info
33c80 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72  .nKey;.    asser
33c90 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79  t( sz==info.nPay
33ca0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20  load );.    if( 
33cb0 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  sz>info.nLocal )
33cc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
33cd0 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e  e = (sz - info.n
33ce0 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69  Local + usableSi
33cf0 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53  ze - 5)/(usableS
33d00 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ize - 4);.      
33d10 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
33d20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
33d30 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
33d40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33d50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33d60 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
33d70 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
33d80 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
33d90 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76  p(pCheck, pgnoOv
33da0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
33db0 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW1, iPage, zCo
33dc0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
33dd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65  #endif.      che
33de0 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30  ckList(pCheck, 0
33df0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67  , pgnoOvfl, nPag
33e00 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
33e10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
33e20 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74  k sanity of left
33e30 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
33e40 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
33e50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
33e60 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
33e70 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  e(pCell);.#ifnde
33e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33e90 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
33ea0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33eb0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
33ec0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
33ed0 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
33ee0 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f  TREE, iPage, zCo
33ef0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
33f00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20  #endif.      d2 
33f10 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  = checkTreePage(
33f20 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67  pCheck,pgno,pPag
33f30 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e,zContext);.   
33f40 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
33f50 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
33f60 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33f70 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
33f80 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
33f90 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
33fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
33fb0 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
33fc0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
33fd0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
33fe0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
33ff0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
34000 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
34010 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
34020 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
34030 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
34040 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
34050 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61            "On pa
34060 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
34070 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
34080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34090 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
340a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
340b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
340c0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
340d0 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
340e0 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
340f0 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
34100 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
34110 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
34120 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   pPage, zContext
34130 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68  );.  }. .  /* Ch
34140 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65  eck for complete
34150 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65   coverage of the
34160 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74   page.  */.  dat
34170 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
34180 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
34190 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69  >hdrOffset;.  hi
341a0 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  t = sqlite3PageM
341b0 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
341c0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69  Size );.  if( hi
341d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 68 65  t==0 ){.    pChe
341e0 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
341f0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
34200 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 30     memset(hit, 0
34210 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  , usableSize );.
34220 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
34230 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  1, get2byte(&dat
34240 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20  a[hdr+5]));.    
34250 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
34260 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
34270 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
34280 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
34290 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
342a0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
342b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
342c0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
342d0 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
342e0 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20 73  2]);.      u16 s
342f0 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
34300 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
34310 66 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a  f( pc<=usableSiz
34320 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 69 7a  e ){.        siz
34330 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
34340 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
34350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34360 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29   if( (pc+size-1)
34370 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
34380 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pc<0 ){.        
34390 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
343a0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
343b0 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
343c0 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
343d0 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
343e0 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
343f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34400 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a      for(j=pc+siz
34410 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29  e-1; j>=pc; j--)
34420 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
34430 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
34440 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79  (cnt=0, i=get2by
34450 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
34460 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c  ; i>0 && i<usabl
34470 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30  eSize && cnt<100
34480 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20  00; .           
34490 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  cnt++){.      in
344a0 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
344b0 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20  e(&data[i+2]);. 
344c0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
344d0 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29    if( (i+size-1)
344e0 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
344f0 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  i<0 ){.        c
34500 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34510 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20  heck, 0,  .     
34520 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
34530 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
34540 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
34550 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
34560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34570 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65      for(j=i+size
34580 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68  -1; j>=i; j--) h
34590 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d  it[j]++;.      }
345a0 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62  .      i = get2b
345b0 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20  yte(&data[i]);. 
345c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63     }.    for(i=c
345d0 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69  nt=0; i<usableSi
345e0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ze; i++){.      
345f0 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b  if( hit[i]==0 ){
34600 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  .        cnt++;.
34610 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34620 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  hit[i]>1 ){.    
34630 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34640 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20  sg(pCheck, 0,.  
34650 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c          "Multipl
34660 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20  e uses for byte 
34670 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20  %d of page %d", 
34680 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  i, iPage);.     
34690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
346a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
346b0 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d  cnt!=data[hdr+7]
346c0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
346d0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
346e0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22   0, .          "
346f0 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  Fragmented space
34700 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f   is %d byte repo
34710 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61  rted as %d on pa
34720 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ge %d",.        
34730 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b    cnt, data[hdr+
34740 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  7], iPage);.    
34750 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  }.  }.  sqlite3P
34760 61 67 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20  ageFree(hit);.. 
34770 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
34780 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65  ge);.  return de
34790 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  pth+1;.}.#endif 
347a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
347b0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
347c0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
347d0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
347e0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  _CHECK./*.** Thi
347f0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
34800 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20   complete check 
34810 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72  of the given BTr
34820 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b  ee file.  aRoot[
34830 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79  ] is.** an array
34840 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72   of pages number
34850 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65  s were each page
34860 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72   number is the r
34870 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61  oot page of.** a
34880 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69   table.  nRoot i
34890 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
348a0 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
348b0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
348c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
348d0 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e 45 72 72  r seen in *pnErr
348e0 2e 20 20 45 78 63 65 70 74 20 66 6f 72 20 73 6f  .  Except for so
348f0 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  me memory.** all
34900 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 20  ocation errors, 
34910 20 6e 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   nn error messag
34920 65 20 69 73 20 68 65 6c 64 20 69 6e 20 6d 65 6d  e is held in mem
34930 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
34940 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73 20 72  m.** malloc is r
34950 65 74 75 72 6e 65 64 20 69 66 20 2a 70 6e 45 72  eturned if *pnEr
34960 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  r is non-zero.  
34970 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20 74 68 65  If *pnErr==0 the
34980 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65 74  n NULL is.** ret
34990 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  urned..*/.char *
349a0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
349b0 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74  grityCheck(.  Bt
349c0 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54  ree *p,     /* T
349d0 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63  he btree to be c
349e0 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
349f0 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20  *aRoot,   /* An 
34a00 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61  array of root pa
34a10 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ges numbers for 
34a20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73  individual trees
34a30 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c   */.  int nRoot,
34a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34a50 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
34a60 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45  t[] */.  int mxE
34a70 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72  rr,    /* Stop r
34a80 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20  eporting errors 
34a90 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20  after this many 
34aa0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20  */.  int *pnErr 
34ab0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62     /* Write numb
34ac0 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
34ad0 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62  n to this variab
34ae0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
34af0 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20  ;.  int nRef;.  
34b00 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65  IntegrityCk sChe
34b10 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ck;.  BtShared *
34b20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34b30 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d 3b 0a  char zErr[100];.
34b40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
34b50 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
34b60 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52  db = p->db;.  nR
34b70 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
34b80 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
34b90 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f  Pager);.  if( lo
34ba0 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
34bb0 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  (p)!=SQLITE_OK )
34bc0 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  {.    *pnErr = 1
34bd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
34be0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
34bf0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 44 62  return sqlite3Db
34c00 53 74 72 44 75 70 28 30 2c 20 22 63 61 6e 6e 6f  StrDup(0, "canno
34c10 74 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  t acquire a read
34c20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
34c30 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
34c40 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
34c50 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
34c60 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
34c70 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
34c80 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
34c90 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a  sCheck.pPager);.
34ca0 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d    sCheck.mxErr =
34cb0 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b   mxErr;.  sCheck
34cc0 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 43 68  .nErr = 0;.  sCh
34cd0 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  eck.mallocFailed
34ce0 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d   = 0;.  *pnErr =
34cf0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
34d00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
34d10 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  UM.  if( pBt->nT
34d20 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  runc!=0 ){.    s
34d30 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42  Check.nPage = pB
34d40 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23  t->nTrunc;.  }.#
34d50 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68 65  endif.  if( sChe
34d60 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  ck.nPage==0 ){. 
34d70 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
34d80 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
34d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
34da0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
34db0 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  n 0;.  }.  sChec
34dc0 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  k.anRef = sqlite
34dd0 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b  3Malloc( (sCheck
34de0 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
34df0 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
34e00 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65  ) );.  if( !sChe
34e10 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20  ck.anRef ){.    
34e20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
34e30 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  sed(pBt);.    *p
34e40 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71  nErr = 1;.    sq
34e50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
34e60 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  p);.    return 0
34e70 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
34e80 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
34e90 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61  ; i++){ sCheck.a
34ea0 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20  nRef[i] = 0; }. 
34eb0 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54   i = PENDING_BYT
34ec0 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69  E_PAGE(pBt);.  i
34ed0 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  f( i<=sCheck.nPa
34ee0 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b  ge ){.    sCheck
34ef0 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20  .anRef[i] = 1;. 
34f00 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
34f10 63 63 75 6d 49 6e 69 74 28 26 73 43 68 65 63 6b  ccumInit(&sCheck
34f20 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73  .errMsg, zErr, s
34f30 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 32 30 30  izeof(zErr), 200
34f40 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  00);..  /* Check
34f50 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
34f60 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
34f70 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
34f80 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
34f90 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
34fa0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
34fb0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
34fc0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
34fd0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
34fe0 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
34ff0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
35000 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
35010 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
35020 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e  nRoot && sCheck.
35030 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
35040 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
35050 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
35060 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35070 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
35080 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
35090 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
350a0 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
350b0 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
350c0 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
350d0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
350e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
350f0 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
35100 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
35110 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
35120 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
35130 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
35140 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
35150 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
35160 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
35170 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
35180 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
35190 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
351a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
351b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
351c0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
351d0 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
351e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
351f0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
35200 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
35210 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
35220 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
35230 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
35240 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
35250 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
35260 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
35270 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
35280 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
35290 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
352a0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
352b0 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
352c0 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
352d0 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
352e0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
352f0 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
35300 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
35310 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
35320 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
35330 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
35340 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
35350 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
35360 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
35370 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
35380 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
35390 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
353a0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
353b0 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
353c0 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
353d0 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
353e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
353f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
35400 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
35410 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
35420 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
35430 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
35440 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
35450 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
35460 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
35470 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
35480 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
35490 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
354a0 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
354b0 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
354c0 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
354d0 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
354e0 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
354f0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
35500 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
35510 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
35520 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
35530 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
35540 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
35550 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
35560 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
35570 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 69  heck.anRef);.  i
35580 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63  f( sCheck.malloc
35590 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
355a0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 65 73  lite3StrAccumRes
355b0 65 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73  et(&sCheck.errMs
355c0 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d  g);.    *pnErr =
355d0 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b 31 3b 0a   sCheck.nErr+1;.
355e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
355f0 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68  }.  *pnErr = sCh
35600 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69 66 28 20  eck.nErr;.  if( 
35610 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20 29  sCheck.nErr==0 )
35620 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
35630 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72  Reset(&sCheck.er
35640 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  rMsg);.  return 
35650 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
35660 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e 65 72  inish(&sCheck.er
35670 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  rMsg);.}.#endif 
35680 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
35690 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
356a0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
356b0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
356c0 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
356d0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
356e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
356f0 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  er filename is i
35700 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
35710 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
35720 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
35730 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
35740 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
35750 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
35760 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
35770 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
35780 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
35790 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
357a0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
357b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
357c0 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70  gerFilename(p->p
357d0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
357e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
357f0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
35800 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
35810 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
35820 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
35830 2a 20 54 68 65 20 70 61 67 65 72 20 64 69 72 65  * The pager dire
35840 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e  ctory name is in
35850 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20  variant as long 
35860 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a  as the pager is.
35870 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73  ** open so it is
35880 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20   safe to access 
35890 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68  without the BtSh
358a0 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63  ared mutex..*/.c
358b0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
358c0 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d  e3BtreeGetDirnam
358d0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
358e0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
358f0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
35900 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
35910 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rDirname(p->pBt-
35920 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  >pPager);.}../*.
35930 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
35940 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
35950 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74  urnal file for t
35960 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54 68  his database. Th
35970 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75  e return.** valu
35980 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e of this routin
35990 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65  e is the same re
359a0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
359b0 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
359c0 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
359d0 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e   created or not.
359e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
359f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
35a00 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
35a10 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
35a20 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
35a30 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
35a40 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
35a50 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
35a60 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
35a70 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
35a80 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72  tJournalname(Btr
35a90 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
35aa0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
35ab0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
35ac0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
35ad0 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  nalname(p->pBt->
35ae0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e  pPager);.}..#ifn
35af0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35b00 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70  VACUUM./*.** Cop
35b10 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  y the complete c
35b20 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f  ontent of pBtFro
35b30 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41  m into pBtTo.  A
35b40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
35b50 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66  must be active f
35b60 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a  or both files..*
35b70 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
35b80 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62 65   file pTo may be
35b90 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
35ba0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
35bb0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
35bc0 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
35bd0 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73  action on pTo is
35be0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a 2a   rolled back. .*
35bf0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
35c00 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f  ul, CommitPhaseO
35c10 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  ne() may be call
35c20 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72 65  ed on pTo before
35c30 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 20   returning. .** 
35c40 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
35c50 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74 74  d finish committ
35c60 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
35c70 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63 61  ion on pTo by ca
35c80 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
35c90 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a 2a  BtreeCommit()..*
35ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
35cb0 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65  eeCopyFile(Btree
35cc0 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46   *pTo, Btree *pF
35cd0 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rom){.  int rc =
35ce0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
35cf0 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e 46  no i;..  Pgno nF
35d00 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  romPage;     /* 
35d10 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35d20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50 67  in pFrom */.  Pg
35d30 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20 20  no nToPage;     
35d40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
35d50 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  ages in pTo */. 
35d60 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b 20   Pgno nNewPage; 
35d70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35d80 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 61  f pages in pTo a
35d90 66 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a 2f  fter the copy */
35da0 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b 20  ..  Pgno iSkip; 
35db0 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69          /* Pendi
35dc0 6e 67 20 62 79 74 65 20 70 61 67 65 20 69 6e 20  ng byte page in 
35dd0 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  pTo */.  int nTo
35de0 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  PageSize;    /* 
35df0 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54 6f  Page size of pTo
35e00 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
35e10 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  nt nFromPageSize
35e20 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20  ;  /* Page size 
35e30 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74 65  of pFrom in byte
35e40 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65 64  s */..  BtShared
35e50 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70   *pBtTo = pTo->p
35e60 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  Bt;.  BtShared *
35e70 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  pBtFrom = pFrom-
35e80 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e 64  >pBt;.  pBtTo->d
35e90 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 70  b = pTo->db;.  p
35ea0 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46 72  BtFrom->db = pFr
35eb0 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50 61  om->db;..  nToPa
35ec0 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d 3e  geSize = pBtTo->
35ed0 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72 6f  pageSize;.  nFro
35ee0 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 46  mPageSize = pBtF
35ef0 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  rom->pageSize;..
35f00 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61    if( pTo->inTra
35f10 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
35f20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e  || pFrom->inTran
35f30 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
35f40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
35f50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
35f60 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72   if( pBtTo->pCur
35f70 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
35f80 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
35f90 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20   }..  nToPage = 
35fa0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
35fb0 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20  BtTo->pPager);. 
35fc0 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20 70 61 67   nFromPage = pag
35fd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 46  erPagecount(pBtF
35fe0 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  rom->pPager);.  
35ff0 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f  iSkip = PENDING_
36000 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29  BYTE_PAGE(pBtTo)
36010 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ;..  /* Variable
36020 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68 65   nNewPage is the
36030 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
36040 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
36050 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74  re the.  ** cont
36060 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75 73  ents of pFrom us
36070 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
36080 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f  page-size of pTo
36090 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61 67  ..  */.  nNewPag
360a0 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d 50  e = ((i64)nFromP
360b0 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d  age * (i64)nFrom
360c0 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36 34 29  PageSize + (i64)
360d0 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 31 29  nToPageSize - 1)
360e0 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34 29 6e   / .      (i64)n
360f0 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 66  ToPageSize;..  f
36100 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
36110 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54 6f  TE_OK && (i<=nTo
36120 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50  Page || i<=nNewP
36130 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  age); i++){..   
36140 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65 20   /* Journal the 
36150 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a 20  original page.. 
36160 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53 6b     **.    ** iSk
36170 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ip is the page n
36180 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f 63  umber of the loc
36190 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44 49  king page (PENDI
361a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20 20  NG_BYTE_PAGE).  
361b0 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65    ** in database
361c0 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74 68   *pTo (before th
361d0 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70 61  e copy). This pa
361e0 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  ge is never writ
361f0 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ten .    ** into
36200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36210 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53 6b  e. Unless i==iSk
36220 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20 77  ip or the page w
36230 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72  as not.    ** pr
36240 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65 66  esent in pTo bef
36250 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70 65  ore the copy ope
36260 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20  ration, journal 
36270 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f 2e  page i from pTo.
36280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36290 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e  i!=iSkip && i<=n
362a0 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ToPage ){.      
362b0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
362c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
362d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
362e0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69  pBtTo->pPager, i
362f0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
36300 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36330 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
36340 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
36350 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e  =SQLITE_OK && i>
36360 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
36370 20 20 20 20 20 20 20 2f 2a 20 59 65 61 68 2e 20         /* Yeah. 
36380 20 49 74 20 73 65 65 6d 73 20 77 69 65 72 64 20   It seems wierd 
36390 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74  to call DontWrit
363a0 65 28 29 20 72 69 67 68 74 20 61 66 74 65 72 20  e() right after 
363b0 57 72 69 74 65 28 29 2e 20 42 75 74 0a 20 20 20  Write(). But.   
363c0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
363d0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 6e 61  s because the na
363e0 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f  mes of those pro
363f0 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65  cedures do not e
36400 78 61 63 74 6c 79 20 0a 20 20 20 20 20 20 20 20  xactly .        
36410 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 77    ** represent w
36420 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57 72  hat they do.  Wr
36430 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65 61  ite() really mea
36440 6e 73 20 22 70 75 74 20 74 68 69 73 20 70 61 67  ns "put this pag
36450 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  e in the.       
36460 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
36470 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b 20  ournal and mark 
36480 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20 74  it as dirty so t
36490 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 77  hat it will be w
364a0 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 20  ritten.         
364b0 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
364c0 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e 22  ase file later."
364d0 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75 6e    DontWrite() un
364e0 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20  does the second 
364f0 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20 20 20  part of.        
36500 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72    ** that and pr
36510 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20  events the page 
36520 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74  from being writt
36530 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
36540 73 65 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  se. The.        
36550 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69    ** page is sti
36560 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ll on the rollba
36570 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75  ck journal, thou
36580 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73  gh.  And that is
36590 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
365a0 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20 6f  ** whole point o
365b0 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74 6f  f this block: to
365c0 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68   put pages on th
365d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
365e0 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  al. .          *
365f0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
36600 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
36610 74 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  tWrite(pDbPage);
36620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36630 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36640 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
36650 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36660 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 74    /* Overwrite t
36670 68 65 20 64 61 74 61 20 69 6e 20 70 61 67 65 20  he data in page 
36680 69 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 20  i of the target 
36690 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
366a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
366b0 4b 20 26 26 20 69 21 3d 69 53 6b 69 70 20 26 26  K && i!=iSkip &&
366c0 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29 7b 0a   i<=nNewPage ){.
366d0 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70  .      DbPage *p
366e0 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ToPage = 0;.    
366f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
36700 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72 63 20  iOff;..      rc 
36710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
36720 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  t(pBtTo->pPager,
36730 20 69 2c 20 26 70 54 6f 50 61 67 65 29 3b 0a 20   i, &pToPage);. 
36740 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36770 67 65 72 57 72 69 74 65 28 70 54 6f 50 61 67 65  gerWrite(pToPage
36780 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
36790 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 69    for(.        i
367a0 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50 61 67  Off=(i-1)*nToPag
367b0 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20  eSize; .        
367c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
367d0 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67 65 53   iOff<i*nToPageS
367e0 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20 69 4f  ize; .        iO
367f0 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53  ff += nFromPageS
36800 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ize.      ){.   
36810 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 46 72       DbPage *pFr
36820 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  omPage = 0;.    
36830 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d      Pgno iFrom =
36840 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65   (iOff/nFromPage
36850 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20 20 20  Size)+1;..      
36860 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e    if( iFrom==PEN
36870 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36880 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20  BtFrom) ){.     
36890 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
368a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
368b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
368c0 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e  gerGet(pBtFrom->
368d0 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26  pPager, iFrom, &
368e0 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
368f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36910 20 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 73     char *zTo = s
36920 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
36930 74 61 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20  ta(pToPage);.   
36940 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72         char *zFr
36950 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  om = sqlite3Page
36960 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61  rGetData(pFromPa
36970 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
36980 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20 20 20  nt nCopy;..     
36990 20 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61       if( nFromPa
369a0 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67 65 53  geSize>=nToPageS
369b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
369c0 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28 69 2d     zFrom += ((i-
369d0 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d  1)*nToPageSize -
369e0 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f   ((iFrom-1)*nFro
369f0 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  mPageSize));.   
36a00 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
36a10 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20   nToPageSize;.  
36a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36a30 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 20 2b             zTo +
36a40 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46  = (((iFrom-1)*nF
36a50 72 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d 20 28  romPageSize) - (
36a60 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
36a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
36a80 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61 67 65  Copy = nFromPage
36a90 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
36aa0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  }..          mem
36ab0 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20  cpy(zTo, zFrom, 
36ac0 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c 69 74  nCopy);..  sqlit
36ad0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46 72  e3PagerUnref(pFr
36ae0 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
36af0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
36b00 20 20 69 66 28 20 70 54 6f 50 61 67 65 20 29 20    if( pToPage ) 
36b10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36b20 66 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20  f(pToPage);.    
36b30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
36b40 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b 65  hings have worke
36b50 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64 61  d so far, the da
36b60 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
36b70 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a  need to be .  **
36b80 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
36b90 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73 20  complex part is 
36ba0 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65 64  that it may need
36bb0 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64   to be truncated
36bc0 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65 20   to.  ** a size 
36bd0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 69  that is not an i
36be0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
36bf0 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d  of nToPageSize -
36c00 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
36c10 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  * page size used
36c20 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61 73   by the pager as
36c30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 42 2d  sociated with B-
36c40 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20  Tree pTo..  **. 
36c50 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c   ** For example,
36c60 20 73 61 79 20 74 68 65 20 70 61 67 65 2d 73 69   say the page-si
36c70 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30 34  ze of pTo is 204
36c80 38 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  8 bytes and the 
36c90 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e  original .  ** n
36ca0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
36cb0 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65 29  s 5 (10 KB file)
36cc0 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20 61  . If pFrom has a
36cd0 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31 30   page size of 10
36ce0 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20 61  24 .  ** bytes a
36cf0 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68 65 6e  nd 9 pages, then
36d00 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20   the file needs 
36d10 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  to be truncated 
36d20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69  to 9KB..  */.  i
36d30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36d40 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72 6f   ){.    if( nFro
36d50 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50 61  mPageSize!=nToPa
36d60 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
36d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
36d80 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
36d90 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70 50  erFile(pBtTo->pP
36da0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36 34  ager);.      i64
36db0 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e 46   iSize = (i64)nF
36dc0 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28 69  romPageSize * (i
36dd0 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20 20  64)nFromPage;.  
36de0 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20 28      i64 iNow = (
36df0 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e 4e  i64)((nToPage>nN
36e00 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65 3a  ewPage)?nToPage:
36e10 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36 34  nNewPage) * (i64
36e20 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20  )nToPageSize; . 
36e30 20 20 20 20 20 69 36 34 20 69 50 65 6e 64 69 6e       i64 iPendin
36e40 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49 4e  g = ((i64)PENDIN
36e50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
36e60 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f 50  o)-1) *(i64)nToP
36e70 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20 20  ageSize;.  .    
36e80 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3c    assert( iSize<
36e90 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20 20  =iNow );.  .    
36ea0 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61 73    /* Commit phas
36eb0 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65 20  e one syncs the 
36ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73  journal file ass
36ed0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 6f  ociated with pTo
36ee0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61   .      ** conta
36ef0 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  ining the origin
36f00 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65 73  al data. It does
36f10 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64 61   not sync the da
36f20 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
36f30 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66 74    ** itself. Aft
36f40 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69 74  er doing this it
36f50 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
36f60 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e 64  OsTruncate() and
36f70 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
36f80 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68 65  file APIs on the
36f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
36fa0 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  irectly..      *
36fb0 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 64  /.      pBtTo->d
36fc0 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 20  b = pTo->db;.   
36fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36fe0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
36ff0 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  ne(pBtTo->pPager
37000 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  , 0, 0, 1);.    
37010 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f 77    if( iSize<iNow
37020 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
37030 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
37040 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
37050 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a 65  ate(pFile, iSize
37060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
37070 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
37080 74 68 61 74 20 63 6f 70 69 65 64 20 64 61 74 61  that copied data
37090 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70   from database p
370a0 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64 20  From to pTo did 
370b0 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f 70  not.      ** pop
370c0 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69 6e  ulate the lockin
370d0 67 20 70 61 67 65 20 6f 66 20 64 61 74 61 62 61  g page of databa
370e0 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20 70  se pTo. If the p
370f0 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20 20  age-size of.    
37100 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73 6d    ** pFrom is sm
37110 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74 20  aller than that 
37120 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65 61  of pTo, this mea
37130 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69 6c  ns some data wil
37140 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68  l.      ** not h
37150 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64 2e  ave been copied.
37160 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
37170 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63   ** This block c
37180 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73 69 6e  opies the missin
37190 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61  g data from data
371a0 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54  base pFrom to pT
371b0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e  o .      ** usin
371c0 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68 69  g file APIs. Thi
371d0 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
371e0 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  e at this point 
371f0 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20 20  we know that.   
37200 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65     ** all of the
37210 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66   original data f
37220 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65 6e  rom pTo has been
37230 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
37240 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
37250 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  al file. At this
37260 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
37270 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61 6e  be safe to do an
37280 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20 20  ything at.      
37290 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64 61  ** all to the da
372a0 74 61 62 61 73 65 20 66 69 6c 65 20 65 78 63 65  tabase file exce
372b0 70 74 20 74 72 75 6e 63 61 74 65 20 69 74 20 74  pt truncate it t
372c0 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20 20  o zero bytes..  
372d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
372e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
372f0 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3c  & nFromPageSize<
37300 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26 20 69  nToPageSize && i
37310 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29 7b 0a  Size>iPending){.
37320 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
37330 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a 20  ;.        for(. 
37340 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d 69 50           iOff=iP
37350 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20 20 20  ending; .       
37360 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
37370 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e 64 69   && iOff<(iPendi
37380 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b  ng+nToPageSize);
37390 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66   .          iOff
373a0 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   += nFromPageSiz
373b0 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  e.        ){.   
373c0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
373d0 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20  FromPage = 0;.  
373e0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
373f0 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d  om = (iOff/nFrom
37400 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20 20 0a  PageSize)+1;.  .
37410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
37420 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rom==PENDING_BYT
37430 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20  E_PAGE(pBtFrom) 
37440 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61  || iFrom>nFromPa
37450 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
37460 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
37470 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
37480 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37490 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f  3PagerGet(pBtFro
374a0 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d  m->pPager, iFrom
374b0 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  , &pFromPage);. 
374c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
374d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
374e0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
374f0 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50  zFrom = sqlite3P
37500 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f  agerGetData(pFro
37510 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
37520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37530 4f 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a  OsWrite(pFile, z
37540 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53  From, nFromPageS
37550 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  ize, iOff);.    
37560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
37570 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50  agerUnref(pFromP
37580 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
37590 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
375a0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
375b0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
375c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
375d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
375e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
375f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
37600 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nc(pBtTo->pPager
37610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37620 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
37630 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
37640 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  ncate(pBtTo->pPa
37650 67 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a  ger, nNewPage);.
37660 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
37670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37680 20 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65       pBtTo->page
37690 53 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20  SizeFixed = 0;. 
376a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
376b0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
376c0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
376d0 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  To);.  }..  retu
376e0 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
376f0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
37700 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
37710 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
37720 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
37730 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f  e3BtreeEnter(pTo
37740 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37750 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20  eEnter(pFrom);. 
37760 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46   rc = btreeCopyF
37770 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b  ile(pTo, pFrom);
37780 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37790 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
377a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
377b0 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
377c0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
377d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
377e0 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UUM */../*.** Re
377f0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
37800 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
37810 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
37820 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
37830 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  nTrans(Btree *p)
37840 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
37850 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
37860 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
37870 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
37880 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
37890 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
378a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
378b0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
378c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
378d0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
378e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
378f0 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74  BtreeIsInStmt(Bt
37900 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
37910 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
37920 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
37930 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
37940 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74   && p->pBt->inSt
37950 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
37960 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
37970 20 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74   a read (or writ
37980 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  e) transaction i
37990 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
379a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
379b0 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65  nReadTrans(Btree
379c0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
379d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
379e0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
379f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
37a00 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
37a10 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
37a20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37a30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
37a40 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62  ointer to a blob
37a50 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
37a60 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  iated with.** a 
37a70 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74  single shared-bt
37a80 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  ree. The memory 
37a90 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e  is used by clien
37aa0 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f  t code for its o
37ab0 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
37ac0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
37ad0 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
37ae0 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
37af0 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
37b00 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
37b10 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
37b20 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
37b30 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
37b40 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
37b50 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
37b60 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
37b70 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
37b80 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
37b90 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
37ba0 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
37bb0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
37bc0 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
37bd0 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
37be0 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
37bf0 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
37c00 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
37c10 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
37c20 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
37c30 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
37c40 2a 20 49 66 20 74 68 65 20 6e 42 79 74 65 73 20  * If the nBytes 
37c50 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
37c60 6e 64 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  nd the blob of m
37c70 65 6d 6f 72 79 20 68 61 73 20 6e 6f 74 20 79 65  emory has not ye
37c80 74 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  t been.** alloca
37c90 74 65 64 2c 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  ted, a null poin
37ca0 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ter is returned.
37cb0 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 73   If the blob has
37cc0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
37cd0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
37ce0 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 6e 6f  s returned as no
37cf0 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4a 75 73 74  rmal..**.** Just
37d00 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61 72   before the shar
37d10 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73  ed-btree is clos
37d20 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
37d30 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
37d40 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e  ** xFree argumen
37d50 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72  t when the memor
37d60 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73  y allocation was
37d70 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64   made is invoked
37d80 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62   on the .** blob
37d90 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65   of allocated me
37da0 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74  mory. This funct
37db0 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ion should not c
37dc0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  all sqlite3_free
37dd0 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d  ().** on the mem
37de0 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c  ory, the btree l
37df0 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a  ayer does that..
37e00 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
37e10 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72 65  BtreeSchema(Btre
37e20 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73  e *p, int nBytes
37e30 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76  , void(*xFree)(v
37e40 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61  oid *)){.  BtSha
37e50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
37e60 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
37e70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
37e80 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 26   !pBt->pSchema &
37e90 26 20 6e 42 79 74 65 73 20 29 7b 0a 20 20 20 20  & nBytes ){.    
37ea0 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73  pBt->pSchema = s
37eb0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
37ec0 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42  (nBytes);.    pB
37ed0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d  t->xFreeSchema =
37ee0 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71   xFree;.  }.  sq
37ef0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
37f00 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  p);.  return pBt
37f10 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a  ->pSchema;.}../*
37f20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
37f30 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20  if another user 
37f40 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72  of the same shar
37f50 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20  ed btree as the 
37f60 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64  argument.** hand
37f70 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  le holds an excl
37f80 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
37f90 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
37fa0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
37fb0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
37fc0 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  Locked(Btree *p)
37fd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
37fe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37ff0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
38000 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
38010 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
38020 3b 0a 20 20 72 63 20 3d 20 28 71 75 65 72 79 54  ;.  rc = (queryT
38030 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
38040 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
38050 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b  CK)!=SQLITE_OK);
38060 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
38070 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
38080 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
38090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
380a0 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
380b0 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
380c0 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73  n the table whos
380d0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69  e root page is i
380e0 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63  Tab.  The.** loc
380f0 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63  k is a write loc
38100 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b  k if isWritelock
38110 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65   is true or a re
38120 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74  ad lock.** if it
38130 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e   is false..*/.in
38140 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
38150 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
38160 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69  , int iTab, u8 i
38170 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69  sWriteLock){.  i
38180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
38190 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  K;.  if( p->shar
381a0 61 62 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c  able ){.    u8 l
381b0 6f 63 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c  ockType = READ_L
381c0 4f 43 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63  OCK + isWriteLoc
381d0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 52  k;.    assert( R
381e0 45 41 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54  EAD_LOCK+1==WRIT
381f0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  E_LOCK );.    as
38200 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
38210 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
38220 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  ock==1 );.    sq
38230 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
38240 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65  p);.    rc = que
38250 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
38260 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
38270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
38290 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
382a0 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
382b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
382c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
382d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
382e0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
382f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
38300 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
38310 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75  Argument pCsr mu
38320 73 74 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f  st be a cursor o
38330 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
38340 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b  g on an .** INTK
38350 45 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  EY table current
38360 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ly pointing at a
38370 20 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74   valid table ent
38380 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ry. .** This fun
38390 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74  ction modifies t
383a0 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 61  he data stored a
383b0 73 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 65  s part of that e
383c0 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ntry..** Only th
383d0 65 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d  e data content m
383e0 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66  ay only be modif
383f0 69 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  ied, it is not p
38400 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68  ossible.** to ch
38410 61 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20  ange the length 
38420 6f 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  of the data stor
38430 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
38440 65 33 42 74 72 65 65 50 75 74 44 61 7