/ Hex Artifact Content
Login

Artifact 4d642d23fc4507089f702eb24b506be2ce7e0efd:


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 36 20 32 30 30 38 2f 30  c,v 1.516 2008/0
0190: 39 2f 31 39 20 31 36 3a 33 39 3a 33 38 20 64 61  9/19 16:39:38 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 28 70 50 61 67 65 2d 3e 70 50 61 72  if( (pPage->pPar
7230: 65 6e 74 21 3d 70 50 61 72 65 6e 74 29 0a 20 20  ent!=pParent).  
7240: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
7250: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
7260: 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53  >isInit==PAGE_IS
7270: 49 4e 49 54 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  INIT_FULL) ){.  
7280: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
7290: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
72a0: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
72b0: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
72c0: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
72d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
72e0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
72f0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
7300: 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
7310: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7320: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 72 65  _OK;.  if( pPare
7330: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
7340: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
7350: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
7360: 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
7370: 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
7380: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  }.  if( pPage->i
7390: 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53 49 4e  sInit==PAGE_ISIN
73a0: 49 54 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 68  IT_NONE ){.    h
73b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
73c0: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
73d0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
73e0: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
73f0: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
7400: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
7410: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7420: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
7430: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
7440: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
7450: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
7460: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
7470: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
7480: 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e - 1;.    pPage
7490: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
74a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
74b0: 68 69 66 74 20 3d 20 30 3b 0a 20 20 20 20 75 73  hift = 0;.    us
74c0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
74d0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
74e0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
74f0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
7500: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
7510: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74  age->leaf;.    t
7520: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
7530: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
7540: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
7550: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7560: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
7570: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
7580: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
7590: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
75a0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
75b0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
75c0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
75d0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
75e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
75f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
7600: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
7610: 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d  ==0 && pParent!=
7620: 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67  0 && pParent->pg
7630: 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  no!=1 ){.      /
7640: 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  * All pages must
7650: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
7660: 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20  ne cell, except 
7670: 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  for root pages *
7680: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
7690: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
76a0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
76b0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
76c0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
76d0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
76e0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
76f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
7700: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
7710: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
7720: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
7730: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
7740: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
7750: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  ){.      int nex
7760: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
7770: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
7780: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
7790: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
77a0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
77b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
77c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
77d0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
77e0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
77f0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
7800: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
7810: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
7820: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
7830: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
7840: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
7850: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
7860: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
7870: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
7880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7890: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
78a0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
78b0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
78c0: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
78d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
78e0: 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b  ->nFree = nFree;
78f0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 3d  .    if( nFree>=
7900: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
7910: 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63      /* Free spac
7920: 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
7930: 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20  total page size 
7940: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
7950: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7960: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  KPT; .    }.  }.
7970: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63  .#if 0.  /* Chec
7980: 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f  k that all the o
7990: 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65  ffsets in the ce
79a0: 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20  ll offset array 
79b0: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
79c0: 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d  . .  ** .  ** Om
79d0: 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73  itting this cons
79e0: 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e  istency check an
79f0: 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61 67  d using the pPag
7a00: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b  e->maskPage mask
7a10: 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
7a20: 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65   overrunning the
7a30: 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 20   page buffer in 
7a40: 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c  findCell() resul
7a50: 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35  ts in a.  ** 2.5
7a60: 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61  % performance ga
7a70: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  in..  */.  {.   
7a80: 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20   u8 *pOff;      
7a90: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73    /* Iterator us
7aa0: 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20  ed to check all 
7ab0: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65  cell offsets are
7ac0: 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20   in range */.   
7ad0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
7ae0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
7af0: 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73  end of cell offs
7b00: 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  et array */.    
7b10: 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  u8 mask;        
7b20: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
7b30: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65   that must be ze
7b40: 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c  ro in MSB of cel
7b50: 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20  l offsets */.   
7b60: 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28   mask = ~(((u8)(
7b70: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
7b80: 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20  ))-1);.    pEnd 
7b90: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
7ba0: 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c  et + pPage->nCel
7bb0: 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f  l*2];.    for(pO
7bc0: 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ff=&data[cellOff
7bd0: 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64  set]; pOff!=pEnd
7be0: 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61   && !((*pOff)&ma
7bf0: 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20  sk); pOff+=2);. 
7c00: 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e     if( pOff!=pEn
7c10: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
7c20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7c30: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
7c40: 0a 23 65 6e 64 69 66 0a 0a 20 20 70 50 61 67 65  .#endif..  pPage
7c50: 2d 3e 69 73 49 6e 69 74 20 3d 20 50 41 47 45 5f  ->isInit = PAGE_
7c60: 49 53 49 4e 49 54 5f 46 55 4c 4c 3b 0a 20 20 72  ISINIT_FULL;.  r
7c70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7c90: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7ca0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7cb0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7cc0: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7cd0: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7ce0: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7cf0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7d00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7d20: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7d30: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7d40: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7d50: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
7d60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7d70: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
7d80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7d90: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
7da0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
7db0: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
7dc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7dd0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
7de0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7df0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
7e00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7e10: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
7e20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7e30: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
7e40: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7e50: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7e60: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7e70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7e80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7e90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
7ea0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
7eb0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
7ec0: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
7ed0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67  data[hdr] = flag
7ee0: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
7ef0: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
7f00: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a  &PTF_LEAF)==0);.
7f10: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
7f20: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
7f30: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
7f40: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7f50: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
7f60: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
7f70: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
7f80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
7f90: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
7fa0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
7fb0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
7fc0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
7fd0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7fe0: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
7ff0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
8000: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
8010: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
8020: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
8030: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
8040: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
8050: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
8060: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
8070: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
8080: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
8090: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 50 41  age->isInit = PA
80a0: 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 3b 0a  GE_ISINIT_FULL;.
80b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
80c0: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
80d0: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
80e0: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
80f0: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
8100: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
8110: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
8120: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
8130: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
8140: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
8150: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
8160: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8170: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
8180: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8190: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
81a0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
81b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
81c0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
81d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
81e0: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
81f0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
8200: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
8210: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
8220: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
8230: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
8240: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
8250: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
8260: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
8270: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
8280: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
8290: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
82a0: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
82b0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
82c0: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
82d0: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
82e0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
82f0: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
8300: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
8310: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
8320: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
8330: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
8340: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
8350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
8360: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
8370: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
8380: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
8390: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
83a0: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
83b0: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
83c0: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
83d0: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
83e0: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
83f0: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
8400: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
8410: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
8420: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
8430: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
8440: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8450: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
8460: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
8470: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
8480: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
8490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
84a0: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
84b0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
84c0: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
84d0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
84e0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
84f0: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
8500: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
8510: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
8520: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
8530: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
8540: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
8550: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8560: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8570: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
8580: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
8590: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
85a0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
85b0: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e  ge**)&pDbPage, n
85c0: 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  oContent);.  if(
85d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
85e0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
85f0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
8600: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
8610: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
8620: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8630: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
8640: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8650: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
8660: 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20  .  Or return -1 
8670: 69 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  if.** there is a
8680: 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  ny kind of error
8690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
86a0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  pagerPagecount(P
86b0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
86c0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
86d0: 50 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Page;.  rc = sql
86e0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
86f0: 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
8700: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63  e);.  return (rc
8710: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61 67  ==SQLITE_OK?nPag
8720: 65 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e:-1);.}../*.** 
8730: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
8740: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
8750: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
8760: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
8770: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
8780: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
8790: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
87a0: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
87b0: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
87c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
87d0: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
87e0: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
87f0: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
8800: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
8810: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
8820: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
8830: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
8840: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
8850: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
8860: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
8870: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
8880: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
8890: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
88a0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
88b0: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
88c0: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
88d0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
88e0: 2a 70 44 62 50 61 67 65 3b 0a 20 20 4d 65 6d 50  *pDbPage;.  MemP
88f0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
8900: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8910: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8920: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
8930: 74 28 20 21 70 50 61 72 65 6e 74 20 7c 7c 20 70  t( !pParent || p
8940: 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 3d 3d  Parent->isInit==
8950: 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
8960: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
8970: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8980: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8990: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KPT; .  }..  /* 
89a0: 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20  It is often the 
89b0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61  case that the pa
89c0: 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c  ge we want is al
89d0: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a  ready in cache..
89e0: 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20    ** If so, get 
89f0: 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  it directly.  Th
8a00: 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d  is saves us from
8a10: 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a   having to call.
8a20: 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f    ** pagerPageco
8a30: 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  unt() to make su
8a40: 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69  re pgno is withi
8a50: 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20  n limits, which 
8a60: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20  results.  ** in 
8a70: 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65  a measureable pe
8a80: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
8a90: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
8aa0: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
8ab0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
8ac0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
8ad0: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
8ae0: 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20  .    /* Page is 
8af0: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
8b00: 20 2a 2f 0a 20 20 20 20 2a 70 70 50 61 67 65 20   */.    *ppPage 
8b10: 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  = pPage = btreeP
8b20: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
8b30: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
8b40: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
8b50: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
8b60: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20      /* Page not 
8b70: 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69  in cache.  Acqui
8b80: 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  re it. */.    if
8b90: 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
8ba0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
8bb0: 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
8bc0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8bd0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
8be0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
8bf0: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
8c00: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
8c10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8c20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
8c30: 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a  Page = *ppPage;.
8c40: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
8c50: 3e 69 73 49 6e 69 74 21 3d 50 41 47 45 5f 49 53  >isInit!=PAGE_IS
8c60: 49 4e 49 54 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  INIT_FULL ){.   
8c70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8c80: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
8c90: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 65  , pParent);.  }e
8ca0: 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 20  lse if( pParent 
8cb0: 26 26 20 28 70 50 61 67 65 3d 3d 70 50 61 72 65  && (pPage==pPare
8cc0: 6e 74 20 7c 7c 20 70 50 61 67 65 2d 3e 70 50 61  nt || pPage->pPa
8cd0: 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 29 20 29  rent!=pParent) )
8ce0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f  {.    /* This co
8cf0: 6e 64 69 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  ndition indicate
8d00: 73 20 61 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  s a loop in the 
8d10: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
8d20: 20 28 74 68 65 20 73 63 65 6e 61 72 69 6f 0a 20   (the scenario. 
8d30: 20 20 20 2a 2a 20 77 68 65 72 65 20 64 61 74 61     ** where data
8d40: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
8d50: 68 61 73 20 63 61 75 73 65 64 20 61 20 70 61 67  has caused a pag
8d60: 65 20 74 6f 20 62 65 20 61 20 64 69 72 65 63 74  e to be a direct
8d70: 20 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 69 72   or.    ** indir
8d80: 65 63 74 20 64 65 73 63 65 6e 64 61 6e 74 20 6f  ect descendant o
8d90: 66 20 69 74 73 65 6c 66 29 2e 0a 20 20 20 20 2a  f itself)..    *
8da0: 2f 20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  / .    rc = SQLI
8db0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8dc0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8dd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8de0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
8df0: 65 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  e);.    *ppPage 
8e00: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8e20: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
8e30: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
8e40: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
8e50: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
8e60: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
8e70: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
8e80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
8e90: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
8ea0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
8eb0: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
8ec0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
8ed0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8ee0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
8ef0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8f00: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
8f10: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
8f20: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
8f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8f40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8f50: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8f60: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
8f70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8f80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f90: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8fa0: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
8fb0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
8fc0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
8fd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
8fe0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8ff0: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
9000: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
9010: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
9020: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
9030: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
9040: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
9050: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
9060: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
9070: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
9080: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  r(DbPage *pData)
9090: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
90a0: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
90b0: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
90c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
90d0: 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ata);.  if( pPag
90e0: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
90f0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 21 3d   pPage->isInit!=
9100: 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
9110: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71   .         || sq
9120: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9130: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9140: 65 78 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ex) .    );.    
9150: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
9160: 6e 74 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  nt ){.      MemP
9170: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  age *pParent = p
9180: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
9190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
91a0: 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50 61 67 65  rent->pBt==pPage
91b0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 20 20 70  ->pBt );.      p
91c0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
91d0: 30 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  0;.      release
91e0: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
91f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
9200: 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45  ge->isInit==PAGE
9210: 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 7b 0a  _ISINIT_FULL ){.
9220: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
9230: 6e 69 74 20 3d 20 50 41 47 45 5f 49 53 49 4e 49  nit = PAGE_ISINI
9240: 54 5f 44 41 54 41 3b 0a 20 20 20 20 7d 0a 20 20  T_DATA;.    }.  
9250: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
9260: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
9270: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
9280: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
9290: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
92a0: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
92b0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
92c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
92d0: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
92e0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
92f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
9300: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
9310: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
9320: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
9330: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
9340: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
9350: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
9360: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
9370: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
9380: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
9390: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
93a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
93b0: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
93c0: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
93d0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
93e0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
93f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9400: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66  tra(pData);.  if
9410: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
9420: 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c  =PAGE_ISINIT_FUL
9430: 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
9440: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9450: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9460: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
9470: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
9480: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
9490: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
94a0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
94b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
94c0: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47  age->isInit==PAG
94d0: 45 5f 49 53 49 4e 49 54 5f 44 41 54 41 20 29 7b  E_ISINIT_DATA ){
94e0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
94f0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
9500: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
9510: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
9520: 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
9530: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42  tic int sqlite3B
9540: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
9550: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
9560: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68  , int n){.  BtSh
9570: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
9580: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
9590: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
95a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
95b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
95c0: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
95d0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
95e0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
95f0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
9600: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
9610: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
9620: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
9630: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
9640: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
9650: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
9660: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
9670: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
9680: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
9690: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
96a0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
96b0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
96c0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
96d0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
96e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
96f0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
9700: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
9710: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
9720: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
9730: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
9740: 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
9750: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
9760: 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
9770: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
9780: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
9790: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
97a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
97b0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
97c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
97d0: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
97e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
97f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
9800: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
9810: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
9820: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
9830: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9840: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
9850: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
9860: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
9870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9880: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
9890: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
98a0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
98b0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
98c0: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
98d0: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71  pen() */.){.  sq
98e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
98f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
9900: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
9910: 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68   btree */.  BtSh
9920: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
9930: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
9940: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
9950: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
9960: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
9970: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
9980: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
9990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
99a0: 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a    int nReserve;.
99b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
99c0: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a  zDbHeader[100];.
99d0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
99e0: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
99f0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
9a00: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
9a10: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
9a20: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
9a30: 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  d database. This
9a40: 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20   symbol is only 
9a50: 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a  required if.  **
9a60: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
9a70: 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75  hared-data or au
9a80: 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65  tovacuum feature
9a90: 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a  s are compiled .
9aa0: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69    ** into the li
9ab0: 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  brary..  */.#if 
9ac0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9ad0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9ae0: 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  E) || !defined(S
9af0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9b00: 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20  ACUUM).  #ifdef 
9b10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
9b20: 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69  RYDB.    const i
9b30: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
9b40: 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73    #else.    cons
9b50: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
9b60: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74  zFilename && !st
9b70: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
9b80: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23  ":memory:");.  #
9b90: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
9ba0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9bb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9bc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
9bd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
9be0: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
9bf0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
9c00: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
9c10: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
9c20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9c30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9c40: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
9c50: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
9c60: 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21  >db = db;..#if !
9c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9c80: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9c90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
9ca0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
9cb0: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
9cc0: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
9cd0: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
9ce0: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
9cf0: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
9d00: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
9d10: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
9d20: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
9d30: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64   */.  if( isMemd
9d40: 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e  b==0.   && (db->
9d50: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
9d60: 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46  tab)==0.   && zF
9d70: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
9d80: 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20  name[0].  ){.   
9d90: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
9da0: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
9db0: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
9dc0: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
9dd0: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
9de0: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
9df0: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
9e00: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
9e10: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
9e20: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
9e30: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
9e40: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
9e50: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
9e60: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
9e70: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64  |= SQLITE_Shared
9e80: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
9e90: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
9ea0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9eb0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
9ec0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9ed0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
9ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9ef0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
9f00: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
9f10: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
9f20: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
9f30: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
9f40: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9f50: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9f60: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
9f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9f80: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
9f90: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f  hared);.      fo
9fa0: 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
9fb0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
9fc0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
9fd0: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
9fe0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
9ff0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
a000: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
a010: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
a020: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
a030: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
a040: 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20  Bt->pPager)).   
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
a060: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
a070: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
a080: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
a090: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
a0a0: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
a0b0: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
a0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a0f0: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
a100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a110: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
a120: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
a130: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
a140: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
a150: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
a160: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
a170: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
a180: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
a190: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
a1a0: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
a1b0: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
a1c0: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
a1d0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
a1e0: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
a1f0: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
a200: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a210: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
a220: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
a230: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
a240: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
a250: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
a260: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
a270: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
a280: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
a290: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
a2a0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
a2b0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
a2c0: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
a2d0: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
a2e0: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
a2f0: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
a300: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
a310: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
a320: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
a330: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
a340: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
a350: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
a360: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
a370: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
a380: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
a390: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
a3a0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
a3b0: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
a3c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
a3d0: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
a3e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
a3f0: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
a400: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
a410: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
a420: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
a430: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
a440: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
a450: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
a460: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a470: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
a480: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
a490: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
a4a0: 74 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63  t->busyHdr.xFunc
a4b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
a4c0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
a4d0: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48  ;.    pBt->busyH
a4e0: 64 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20  dr.pArg = pBt;. 
a4f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
a500: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
a510: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
a520: 6c 65 6e 61 6d 65 2c 20 70 61 67 65 44 65 73 74  lename, pageDest
a530: 72 75 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  ructor,.        
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
a560: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
a570: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a580: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
a590: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a5a0: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
a5b0: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
a5c0: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
a5d0: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
a5e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a5f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
a600: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
a610: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
a620: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
a630: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
a640: 67 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48  ger, &pBt->busyH
a650: 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  dr);.    p->pBt 
a660: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
a670: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
a680: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
a690: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
a6a0: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
a6b0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
a6c0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
a6d0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
a6e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
a6f0: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
a700: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
a710: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
a720: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
a730: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
a740: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
a750: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
a760: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
a770: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
a780: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
a790: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
a7a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
a7b0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20  >pageSize = 0;. 
a7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
a7d0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
a7e0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
a7f0: 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64  pageSize);.#ifnd
a800: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a810: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
a820: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
a830: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
a840: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
a850: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
a860: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
a870: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
a880: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
a890: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
a8a0: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
a8b0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
a8c0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a8d0: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
a8e0: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
a8f0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
a900: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
a910: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
a920: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
a930: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
a940: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
a950: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
a960: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
a970: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
a980: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
a990: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
a9a0: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
a9b0: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
a9c0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
a9d0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
a9e0: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
a9f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
aa00: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
aa10: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
aa20: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
aa30: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
aa40: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
aa50: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
aa60: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
aa70: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
aa80: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
aa90: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
aaa0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
aab0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
aac0: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
aad0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
aae0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
aaf0: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
ab00: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
ab10: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
ab20: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
ab30: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
ab40: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
ab50: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
ab60: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
ab70: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
ab80: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
ab90: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
aba0: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
abb0: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
abc0: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
abd0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
abe0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
abf0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
ac00: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
ac10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ac20: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
ac30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ac40: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
ac50: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
ac60: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
ac70: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
ac80: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
ac90: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
aca0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
acb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
acc0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
acd0: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
ace0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
acf0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
ad00: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
ad10: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
ad20: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
ad30: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
ad40: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
ad50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
ad60: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
ad70: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
ad80: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ad90: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ada0: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
adb0: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
adc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
add0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ade0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
adf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
ae00: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
ae10: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
ae20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ae30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ae40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
ae50: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
ae60: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
ae70: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
ae80: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
ae90: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
aea0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
aeb0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
aec0: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
aed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
aee0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
aef0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
af00: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
af10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
af20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
af30: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
af40: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
af50: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
af60: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
af70: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
af80: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
af90: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
afa0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
afb0: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
afc0: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
afd0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
afe0: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
aff0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
b000: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
b010: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
b020: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
b030: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
b040: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
b050: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
b060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
b070: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
b080: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
b090: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
b0a0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
b0b0: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
b0c0: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
b0d0: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
b0e0: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
b0f0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
b100: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
b110: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
b120: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
b130: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
b140: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
b150: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
b160: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
b170: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
b180: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
b190: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
b1a0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
b1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b1c0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
b1d0: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
b1e0: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
b1f0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
b200: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
b210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
b220: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
b230: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b240: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
b250: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
b260: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
b270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
b290: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
b2a0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
b2b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b2c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
b2d0: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
b2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
b2f0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
b300: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
b310: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
b320: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
b330: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
b340: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
b350: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b360: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
b370: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
b380: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
b390: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
b3a0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
b3b0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
b3c0: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
b3d0: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
b3e0: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
b3f0: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
b400: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
b410: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
b420: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
b430: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
b440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b450: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
b460: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
b470: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
b480: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b490: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
b4a0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
b4b0: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
b4c0: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
b4d0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
b4e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
b4f0: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
b500: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
b510: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
b520: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
b530: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
b540: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b550: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
b560: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
b570: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
b580: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
b590: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
b5a0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
b5b0: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
b5c0: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
b5d0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
b5e0: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
b5f0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
b600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
b610: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
b620: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
b630: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
b640: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
b650: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
b660: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
b670: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
b680: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
b690: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
b6a0: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
b6b0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
b6c0: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
b6d0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
b6e0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
b6f0: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
b700: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
b710: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
b720: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
b730: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
b740: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
b750: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
b760: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
b770: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
b780: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
b790: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
b7a0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
b7b0: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
b7c0: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
b7d0: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
b7e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
b7f0: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
b800: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
b810: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
b820: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
b830: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
b840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
b850: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
b860: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
b870: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
b880: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
b890: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
b8a0: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
b8b0: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
b8c0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
b8d0: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
b8e0: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
b8f0: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
b900: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
b910: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
b920: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
b930: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
b940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
b950: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
b960: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b970: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
b980: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
b990: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
b9a0: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
b9b0: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
b9c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b9d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
b9e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
b9f0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ba00: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
ba10: 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d 20  p->db;.  pCur = 
ba20: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
ba30: 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
ba40: 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
ba50: 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
ba60: 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
ba70: 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
ba80: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
ba90: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
baa0: 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
bab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
bac0: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
bad0: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
bae0: 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
baf0: 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
bb00: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
bb10: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
bb20: 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
bb30: 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
bb40: 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
bb50: 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
bb60: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
bb70: 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74  back(p);.  sqlit
bb80: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
bb90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
bba0: 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
bbb0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
bbc0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
bbd0: 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
bbe0: 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
bbf0: 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
bc00: 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
bc10: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
bc20: 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
bc30: 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
bc40: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
bc50: 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
bc60: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
bc70: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
bc80: 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
bc90: 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
bca0: 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
bcb0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
bcc0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
bcd0: 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
bce0: 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
bcf0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
bd00: 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
bd10: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
bd20: 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
bd30: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
bd40: 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
bd50: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
bd60: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
bd70: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
bd80: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
bd90: 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
bda0: 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
bdb0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
bdc0: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
bdd0: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
bde0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bdf0: 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68  3_free(pBt->pSch
be00: 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
be10: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
be20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
be30: 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
be40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
be50: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
be60: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
be70: 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
be80: 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
be90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
bea0: 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
beb0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
bec0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
bed0: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
bee0: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
bef0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
bf00: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
bf10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bf20: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
bf30: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
bf40: 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
bf50: 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
bf60: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
bf70: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
bf80: 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
bf90: 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
bfa0: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
bfb0: 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
bfc0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
bfd0: 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
bfe0: 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
bff0: 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
c000: 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
c010: 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
c020: 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
c030: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
c040: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
c050: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
c060: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
c070: 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
c080: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
c090: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
c0a0: 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
c0b0: 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
c0c0: 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
c0d0: 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
c0e0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
c0f0: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
c100: 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
c110: 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
c120: 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
c130: 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
c140: 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
c150: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
c160: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
c170: 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
c180: 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
c190: 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
c1a0: 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
c1b0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
c1c0: 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
c1d0: 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
c1e0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
c1f0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
c200: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
c210: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c220: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
c230: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c240: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
c250: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
c260: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
c270: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
c280: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
c290: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
c2a0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c2b0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
c2c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c2d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
c2e0: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
c2f0: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
c300: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
c310: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
c320: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
c330: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
c340: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
c350: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
c360: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
c370: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
c380: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
c390: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
c3a0: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
c3b0: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
c3c0: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
c3d0: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
c3e0: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
c3f0: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
c400: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
c410: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
c420: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
c430: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
c440: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
c450: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
c460: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
c470: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
c480: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
c490: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
c4a0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
c4b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
c4c0: 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
c4d0: 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
c4e0: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
c4f0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c500: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
c510: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c520: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
c530: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
c540: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c550: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
c560: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
c570: 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
c580: 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71   fullSync);.  sq
c590: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c5a0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
c5b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
c5c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
c5d0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
c5e0: 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
c5f0: 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
c600: 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
c610: 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
c620: 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
c630: 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
c640: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
c650: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
c660: 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
c670: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
c680: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
c690: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
c6a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c6b0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
c6c0: 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
c6d0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c6e0: 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
c6f0: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
c700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c710: 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
c720: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
c730: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c740: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
c750: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c760: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
c770: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
c780: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
c790: 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61  ACUUM)./*.** Cha
c7a0: 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
c7b0: 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
c7c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
c7d0: 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
c7e0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
c7f0: 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
c800: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
c810: 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
c820: 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
c830: 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
c840: 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
c850: 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
c860: 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
c870: 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
c880: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
c890: 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
c8a0: 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
c8b0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
c8c0: 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
c8d0: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
c8e0: 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
c8f0: 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
c900: 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
c910: 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
c920: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
c930: 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
c940: 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
c950: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
c960: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
c970: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
c980: 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
c990: 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
c9a0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
c9b0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
c9c0: 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
c9d0: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
c9e0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
c9f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
ca00: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
ca10: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
ca20: 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
ca30: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ca40: 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
ca50: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
ca60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ca70: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
ca80: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
ca90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
caa0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
cab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
cac0: 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
cad0: 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
cae0: 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
caf0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
cb00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
cb10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53  .  }.  if( pageS
cb20: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
cb30: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
cb40: 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
cb50: 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
cb60: 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
cb70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cb80: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
cb90: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
cba0: 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
cbb0: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
cbc0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
cbd0: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
cbe0: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
cbf0: 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
cc00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
cc10: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
cc20: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
cc30: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
cc40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
cc50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
cc60: 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74  Reserve;.  sqlit
cc70: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
cc80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cc90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
cca0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
ccb0: 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
ccc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ccd0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
cce0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
ccf0: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
cd00: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
cd10: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
cd20: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
cd30: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
cd40: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
cd50: 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
cd60: 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
cd70: 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
cd80: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
cd90: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
cda0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
cdb0: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
cdc0: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
cdd0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
cde0: 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
cdf0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
ce00: 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
ce10: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
ce20: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
ce30: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
ce40: 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
ce50: 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
ce60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
ce70: 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
ce80: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
ce90: 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
cea0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ceb0: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
cec0: 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
ced0: 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
cee0: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
cef0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
cf00: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
cf10: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
cf20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cf30: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
cf40: 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
cf50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
cf60: 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
cf70: 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
cf80: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
cf90: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
cfa0: 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
cfb0: 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
cfc0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
cfd0: 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
cfe0: 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
cff0: 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
d000: 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
d010: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
d020: 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
d030: 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
d040: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
d050: 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
d060: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
d070: 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
d080: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
d090: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
d0a0: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
d0b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
d0c0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d0d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
d0e0: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
d0f0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d100: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
d110: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d120: 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f 56   int av = (autoV
d130: 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73  acuum?1:0);..  s
d140: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
d150: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
d160: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26  pageSizeFixed &&
d170: 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61   av!=pBt->autoVa
d180: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
d190: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
d1a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d1b0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
d1c0: 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   av;.  }.  sqlit
d1d0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
d1e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
d1f0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
d200: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
d210: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
d220: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
d230: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
d240: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
d250: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
d260: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
d270: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
d280: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
d290: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
d2a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
d2b0: 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
d2c0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
d2d0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
d2e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
d2f0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
d300: 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
d310: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
d320: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
d330: 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
d340: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
d350: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
d360: 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
d370: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
d380: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
d390: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
d3a0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
d3b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
d3c0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
d3d0: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
d3e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
d3f0: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
d400: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
d410: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
d420: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
d430: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
d440: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
d450: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
d460: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
d470: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
d480: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
d490: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
d4a0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
d4b0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
d4c0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
d4d0: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
d4e0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
d4f0: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
d500: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
d510: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
d520: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
d530: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
d540: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
d550: 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
d560: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d570: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d580: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
d590: 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75 72  ->pPage1 ) retur
d5a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  n SQLITE_OK;.  r
d5b0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d5c0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
d5d0: 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
d5e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d5f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
d600: 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
d610: 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
d620: 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
d630: 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
d640: 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
d650: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
d660: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
d670: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
d680: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
d690: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
d6a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d6b0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
d6c0: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65  _failed;.  }else
d6d0: 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
d6e0: 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65      int pageSize
d6f0: 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  ;.    int usable
d700: 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
d710: 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
d720: 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
d730: 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
d740: 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
d750: 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
d760: 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
d770: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
d780: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
d790: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
d7a0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
d7b0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
d7c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
d7d0: 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
d7e0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d7f0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d800: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
d810: 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
d820: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
d830: 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
d840: 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
d850: 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
d860: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
d870: 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
d880: 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
d890: 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
d8a0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
d8b0: 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
d8c0: 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
d8d0: 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
d8e0: 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
d8f0: 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
d900: 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
d910: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
d920: 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
d930: 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
d940: 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
d950: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d960: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
d970: 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74    pageSize = get
d980: 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d  2byte(&page1[16]
d990: 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
d9a0: 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
d9b0: 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a  e)!=0 || pageSiz
d9c0: 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20  e<512 ||.       
d9d0: 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47   (SQLITE_MAX_PAG
d9e0: 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20  E_SIZE<32768 && 
d9f0: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
da00: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20  MAX_PAGE_SIZE). 
da10: 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
da20: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
da30: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
da40: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
da50: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75  & 7)==0 );.    u
da60: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
da70: 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
da80: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
da90: 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
daa0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
dab0: 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
dac0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
dad0: 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
dae0: 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
daf0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
db00: 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
db10: 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
db20: 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
db30: 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
db40: 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
db50: 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
db60: 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
db70: 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
db80: 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
db90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dba0: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
dbb0: 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
dbc0: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
dbd0: 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
dbe0: 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
dbf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
dc00: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
dc10: 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
dc20: 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
dc30: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
dc40: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
dc50: 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
dc60: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
dc70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
dc80: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
dc90: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
dca0: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
dcb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dcc0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
dcd0: 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35  if( usableSize<5
dce0: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
dcf0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
dd00: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
dd10: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
dd20: 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
dd30: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
dd40: 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
dd50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
dd60: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
dd70: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
dd80: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
dd90: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
dda0: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
ddb0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ddc0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
ddd0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
dde0: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
ddf0: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
de00: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
de10: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
de20: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
de30: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
de40: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
de50: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
de60: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
de70: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
de80: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
de90: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
dea0: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
deb0: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
dec0: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
ded0: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
dee0: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
def0: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
df00: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
df10: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
df20: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
df30: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
df40: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
df50: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
df60: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
df70: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
df80: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
df90: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
dfa0: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
dfb0: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
dfc0: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
dfd0: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
dfe0: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
dff0: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
e000: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
e010: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
e020: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
e030: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
e040: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
e050: 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
e060: 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 23;.  pBt->min
e070: 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
e080: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
e090: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
e0a0: 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e  >maxLeaf = pBt->
e0b0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b  usableSize - 35;
e0c0: 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
e0d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
e0e0: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
e0f0: 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  23;.  assert( pB
e100: 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
e110: 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
e120: 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
e130: 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
e140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e150: 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
e160: 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
e170: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
e180: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
e190: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e1a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e1b0: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
e1c0: 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
e1d0: 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
e1e0: 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
e1f0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
e200: 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
e210: 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
e220: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
e230: 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
e240: 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
e250: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e260: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e270: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
e280: 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20  (pRef) );.  if( 
e290: 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  pRef->inTrans==T
e2a0: 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
e2b0: 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
e2c0: 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69  n = pRef->pBt->i
e2d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
e2e0: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
e2f0: 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d  (pRef);.    rc =
e300: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
e310: 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29  inTrans(pRef, 0)
e320: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d  ;.    pRef->pBt-
e330: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
e340: 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a   inTransaction;.
e350: 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e      pRef->inTran
e360: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
e370: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e380: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
e390: 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  Ref->pBt->nTrans
e3a0: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  action--;.    }.
e3b0: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
e3c0: 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20  ty(pRef);.  }.  
e3d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20  return rc;.}.   
e3e0: 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74      ../*.** If t
e3f0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
e400: 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
e410: 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
e420: 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
e430: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
e440: 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
e450: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
e460: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
e470: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
e480: 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
e490: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
e4a0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
e4b0: 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
e4c0: 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
e4d0: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
e4e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
e4f0: 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
e500: 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73  ng cursors, this
e510: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e520: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
e530: 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
e540: 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
e550: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e560: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
e570: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
e580: 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
e590: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
e5a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e5b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
e5c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
e5d0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
e5e0: 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
e5f0: 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
e600: 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
e610: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
e620: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
e630: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
e640: 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  >=1 ){.      ass
e650: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
e660: 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30  ->aData );.#if 0
e670: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
e680: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30  pPage1->aData==0
e690: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
e6a0: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74  age *pPage = pBt
e6b0: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20  ->pPage1;.      
e6c0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
e6d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e6e0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
e6f0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  age);.        pP
e700: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
e710: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
e720: 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  gno = 1;.      }
e730: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
e740: 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
e750: 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
e760: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e770: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  0;.    pBt->inSt
e780: 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mt = 0;.  }.}../
e790: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
e7a0: 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
e7b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
e7c0: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
e7d0: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
e7e0: 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
e7f0: 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
e800: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
e810: 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
e820: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
e830: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
e840: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
e850: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e860: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e880: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
e890: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
e8a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e8b0: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
e8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e8d0: 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
e8e0: 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
e8f0: 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
e900: 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
e910: 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
e920: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
e930: 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
e940: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
e950: 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
e960: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
e970: 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
e980: 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
e990: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
e9a0: 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
e9b0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
e9c0: 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
e9d0: 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
e9e0: 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
e9f0: 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  1;.  data[20] = 
ea00: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
ea10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
ea20: 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
ea30: 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
ea40: 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
ea50: 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
ea60: 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
ea70: 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
ea80: 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
ea90: 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
eaa0: 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70  DATA );.  pBt->p
eab0: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
eac0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ead0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
eae0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
eaf0: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
eb00: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
eb10: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
eb20: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
eb30: 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
eb40: 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
eb50: 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
eb60: 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
eb70: 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
eb80: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
eb90: 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
eba0: 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
ebb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ebc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
ebd0: 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
ebe0: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
ebf0: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
ec00: 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
ec10: 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
ec20: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
ec30: 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
ec40: 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
ec50: 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
ec60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
ec70: 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
ec80: 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
ec90: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
eca0: 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
ecb0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
ecc0: 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
ecd0: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
ece0: 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
ecf0: 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
ed00: 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
ed10: 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
ed20: 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
ed30: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
ed40: 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
ed50: 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
ed60: 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
ed70: 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
ed80: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
ed90: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
eda0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
edb0: 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
edc0: 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
edd0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
ede0: 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
edf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
ee00: 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
ee10: 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
ee20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
ee30: 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
ee40: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ee50: 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
ee60: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
ee70: 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
ee80: 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
ee90: 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
eea0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
eeb0: 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
eec0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
eed0: 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
eee0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
eef0: 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
ef00: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
ef10: 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
ef20: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
ef30: 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
ef40: 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
ef50: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
ef60: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
ef70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
ef80: 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
ef90: 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
efa0: 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
efb0: 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
efc0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
efd0: 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
efe0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
eff0: 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
f000: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
f010: 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
f020: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
f030: 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
f040: 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
f050: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
f060: 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
f070: 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
f080: 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
f090: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
f0a0: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
f0b0: 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
f0c0: 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
f0d0: 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
f0e0: 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
f0f0: 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
f100: 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
f110: 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
f120: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
f130: 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
f140: 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
f150: 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
f160: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
f170: 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
f180: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
f190: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
f1a0: 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
f1b0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
f1c0: 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
f1d0: 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
f1e0: 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
f1f0: 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
f200: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
f210: 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
f220: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
f230: 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
f240: 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
f250: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
f260: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
f270: 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
f280: 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
f290: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f2a0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
f2b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f2c0: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
f2d0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
f2e0: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62  >db = p->db;.  b
f2f0: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
f300: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
f310: 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
f320: 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
f330: 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
f340: 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
f350: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
f360: 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
f370: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
f380: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
f390: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
f3a0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
f3b0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
f3c0: 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
f3d0: 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
f3e0: 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
f3f0: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
f400: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
f410: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
f420: 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
f430: 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
f440: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
f450: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
f460: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
f470: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
f480: 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
f490: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
f4a0: 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
f4b0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
f4c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
f4d0: 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
f4e0: 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
f4f0: 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
f500: 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
f510: 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
f520: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
f530: 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
f540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
f550: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  Y..  */.  if( pB
f560: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
f570: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
f580: 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
f590: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f5a0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
f5b0: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
f5c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f5d0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
f5e0: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
f5f0: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
f600: 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
f610: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
f620: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
f630: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
f640: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
f650: 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =p ){.        rc
f660: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
f670: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61          goto tra
f680: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20  ns_begun;.      
f690: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f6a0: 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  if..  do {.    i
f6b0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
f6c0: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  0 ){.      do{. 
f6d0: 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b         rc = lock
f6e0: 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  Btree(pBt);.    
f6f0: 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70    }while( pBt->p
f700: 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d  Page1==0 && rc==
f710: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
f720: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
f730: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
f740: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
f750: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
f760: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
f770: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
f780: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f790: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f7a0: 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
f7b0: 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
f7c0: 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  , wrflag>1);.   
f7d0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f7e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f7f0: 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
f800: 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
f810: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f820: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
f830: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f840: 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20       if( wrflag 
f850: 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  ) pBt->inStmt = 
f860: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
f870: 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
f880: 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
f890: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
f8a0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
f8b0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
f8c0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
f8d0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  &&.          sql
f8e0: 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42  ite3BtreeInvokeB
f8f0: 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c 20  usyHandler(pBt, 
f900: 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  0) );..  if( rc=
f910: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f920: 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
f930: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
f940: 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
f950: 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  saction++;.    }
f960: 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
f970: 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
f980: 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
f990: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
f9a0: 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
f9b0: 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
f9c0: 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
f9d0: 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
f9e0: 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  s;.    }.#ifndef
f9f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
fa00: 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66  RED_CACHE.    if
fa10: 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
fa20: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
fa30: 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b 0a  ->pExclusive );.
fa40: 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c        pBt->pExcl
fa50: 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20 7d  usive = p;.    }
fa60: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
fa70: 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74 72  ans_begun:.  btr
fa80: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
fa90: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
faa0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
fab0: 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   rc;.}...#ifndef
fac0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fad0: 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
fae0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
faf0: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
fb00: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
fb10: 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
fb20: 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
fb30: 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
fb40: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
fb50: 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
fb60: 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
fb70: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
fb80: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
fb90: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
fba0: 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
fbb0: 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
fbc0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fbf0: 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
fc00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fc30: 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
fc40: 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
fc50: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
fc80: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
fc90: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
fca0: 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72  ;.  int isInitOr
fcb0: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
fcc0: 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
fcd0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
fce0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fcf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
fd00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
fd10: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
fd20: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
fd30: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
fd40: 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
fd50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fd60: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
fd70: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
fd80: 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
fd90: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
fda0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
fdb0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
fdc0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
fdd0: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
fde0: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
fdf0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
fe00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
fe10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fe20: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
fe30: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
fe40: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
fe50: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
fe60: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
fe70: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
fe80: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
fe90: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
fea0: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
feb0: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
fec0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fed0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
fee0: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
fef0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
ff00: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
ff10: 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
ff20: 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
ff30: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
ff40: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
ff50: 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20  set+8]);.    rc 
ff60: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
ff70: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
ff80: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
ff90: 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
ffa0: 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
ffb0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
ffc0: 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
ffd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ffe0: 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
fff0: 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75  age, which is gu
10000 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61  arenteed to be a
10010 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74   btree page, not
10020 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
10030 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  page, is a point
10040 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
10050 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f  . Modify this po
10060 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  inter so that it
10070 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54   points to.** iT
10080 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
10090 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
100a0 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
100b0 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c   to be modified,
100c0 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a   as .** follows:
100d0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
100e0 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
100f0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
10100 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
10110 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
10140 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
10150 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
10160 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
10170 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
10180 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
10190 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
101a0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
101b0 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
101c0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
101d0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
101e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
101f0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
10200 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
10210 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
10220 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
10240 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
10250 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
10260 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
10270 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
10280 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
10290 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
102a0 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
102b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
102c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
102d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
102e0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
102f0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
10300 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
10310 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
10320 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
10330 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
10340 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
10350 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
10360 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
10370 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10380 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10390 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
103a0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
103b0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
103c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73  else{.    int is
103d0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
103e0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
103f0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
10400 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ll;..    sqlite3
10410 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
10420 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65  age, 0);.    nCe
10430 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
10440 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
10450 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
10460 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
10470 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
10480 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
10490 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
104a0 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
104b0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
104c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
104d0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
104e0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
104f0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
10500 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
10510 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
10520 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
10530 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
10540 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
10550 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
10560 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
10570 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
10580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
10590 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
105a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
105b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
105c0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
105d0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
105e0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
105f0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
10600 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10620 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
10630 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
10640 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
10650 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
10660 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
10670 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
10680 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
10690 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
106a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
106b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
106c0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
106d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
106e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
106f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
10700 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
10710 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
10720 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
10730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10740 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
10750 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
10760 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
10770 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
10780 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
10790 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
107a0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
107b0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
107c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
107d0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
107e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
107f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
10800 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
10810 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
10820 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
10830 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
10840 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
10850 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
10860 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
10870 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
10880 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
10890 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
108a0 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
108b0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
108c0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
108d0 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
108e0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
108f0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
10900 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
10910 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
10920 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
10930 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
10940 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
10950 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
10960 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
10970 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
10980 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
10990 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
109a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
109b0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
109c0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
109d0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
109e0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
109f0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
10a00 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
10a10 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
10a20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
10a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10a40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10a50 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
10a60 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
10a70 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
10a80 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
10a90 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10aa0 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
10ab0 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
10ac0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
10ad0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
10ae0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
10af0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
10b00 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
10b10 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
10b20 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
10b30 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
10b40 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10b50 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
10b60 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
10b70 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
10b80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
10ba0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
10bb0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
10bc0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
10bd0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
10be0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
10bf0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
10c00 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
10c10 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
10c20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
10c30 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
10c40 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
10c50 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
10c60 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
10c70 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
10c80 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
10c90 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
10ca0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
10cb0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
10cc0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
10cd0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
10ce0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
10cf0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
10d00 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
10d10 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
10d20 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
10d30 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
10d40 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
10d50 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
10d60 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
10d70 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
10d80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
10d90 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
10da0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
10db0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
10dc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10dd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10de0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
10df0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
10e00 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
10e10 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
10e20 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
10e30 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
10e40 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
10e50 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
10e60 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
10e70 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
10e80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10ea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10ec0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
10ed0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
10ee0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
10ef0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
10f00 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
10f10 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
10f20 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
10f30 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
10f40 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
10f50 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
10f60 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
10f70 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10f90 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
10fa0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
10fb0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
10fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10fd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10fe0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
10ff0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
11000 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
11010 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
11020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11030 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
11040 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
11050 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11060 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
11070 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
11080 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
11090 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
110a0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
110b0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
110c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
110d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
110e0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
110f0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
11100 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
11110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11120 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
11130 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
11140 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
11150 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
11160 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
11170 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
11180 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
11190 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
111a0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
111b0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
111c0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
111d0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
111e0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
111f0 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
11200 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
11210 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
11220 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
11230 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
11240 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
11250 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
11260 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
11270 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
11280 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
11290 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
112a0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
112b0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
112c0 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
112d0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
112e0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
112f0 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
11300 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
11310 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
11320 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
11330 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
11340 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
11350 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
11360 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
11370 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
11380 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
11390 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
113a0 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
113b0 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
113c0 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
113d0 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
113e0 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
113f0 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
11400 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
11410 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
11420 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
11430 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
11440 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
11450 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74  n){.  Pgno iLast
11460 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
11470 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
11480 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
11490 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
114a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
114b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
114c0 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
114d0 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
114e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
114f0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11500 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67 20  x) );.  iLastPg 
11510 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
11520 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20   if( iLastPg==0 
11530 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d  ){.    iLastPg =
11540 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
11550 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
11560 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
11570 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
11580 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
11590 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
115a0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
115b0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
115c0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
115d0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
115e0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
115f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11600 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
11610 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
11620 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
11630 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
11640 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
11650 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
11660 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
11670 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
11680 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
11690 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
116a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
116b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
116c0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
116d0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
116e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
116f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11700 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
11710 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
11720 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
11730 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
11740 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
11750 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
11760 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
11770 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
11780 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
11790 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
117a0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
117b0 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
117c0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
117d0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
117e0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
117f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11800 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
11810 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
11820 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
11830 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
11840 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
11850 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
11860 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
11870 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
11880 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
11890 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
118a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
118b0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
118c0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
118d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
118e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
118f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11900 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
11920 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
11930 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
11940 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
11950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
11960 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
11970 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
11980 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
11990 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
119a0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
119b0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
119c0 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
119d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
119e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
119f0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
11a00 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
11a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11a20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11a30 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
11a40 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
11a50 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
11a60 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
11a70 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
11a80 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
11a90 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
11aa0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
11ab0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
11ac0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
11ad0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
11ae0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
11af0 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
11b00 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
11b10 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
11b20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
11b30 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
11b40 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
11b50 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
11b60 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
11b70 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
11b80 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
11b90 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
11ba0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
11bb0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
11bc0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
11bd0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
11be0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
11bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11c10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
11c20 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
11c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
11c50 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
11c60 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
11c70 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
11c80 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
11c90 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
11ca0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
11cb0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
11cc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
11cd0 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
11ce0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
11cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
11d10 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
11d20 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
11d30 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
11d40 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20  , nFin!=0);.    
11d50 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
11d60 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
11d70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11d90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11db0 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d  .  pBt->nTrunc =
11dc0 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20   iLastPg - 1;.  
11dd0 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75  while( pBt->nTru
11de0 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  nc==PENDING_BYTE
11df0 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
11e00 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
11e10 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20  Bt->nTrunc) ){. 
11e20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d     pBt->nTrunc--
11e30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11e40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11e50 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
11e60 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
11e70 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
11e80 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
11e90 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
11ea0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
11eb0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
11ec0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
11ed0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
11ee0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
11ef0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
11f00 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
11f10 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
11f20 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
11f30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
11f40 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
11f50 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
11f60 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c   occured,.** SQL
11f70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11f80 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
11f90 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11fa0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
11fb0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
11fc0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
11fd0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
11fe0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11ff0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12000 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
12010 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
12020 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
12030 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
12040 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
12050 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
12060 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
12070 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
12080 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12090 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
120a0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
120b0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
120c0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63  t);.    rc = inc
120d0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
120e0 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
120f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12110 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12120 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
12130 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
12140 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
12150 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
12160 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
12170 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
12180 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
12190 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
121a0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
121b0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
121c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
121d0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
121e0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
121f0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
12200 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
12210 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
12220 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
12230 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
12240 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
12250 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
12260 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
12270 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
12280 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
12290 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
122a0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a  red *pBt, Pgno *
122b0 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20  pnTrunc){.  int 
122c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
122d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
122e0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23  = pBt->pPager;.#
122f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12300 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
12310 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
12320 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a  pPager);.#endif.
12330 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12340 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12350 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
12360 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
12370 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
12380 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
12390 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
123a0 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
123b0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
123c0 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  in = 0;..    if(
123d0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20   pBt->nTrunc==0 
123e0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46  ){.      Pgno nF
123f0 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ree;.      Pgno 
12400 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63  nPtrmap;.      c
12410 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
12420 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  pBt->pageSize;. 
12430 20 20 20 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d       int nOrig =
12440 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
12450 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20  pBt->pPager);.. 
12460 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f       if( PTRMAP_
12470 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
12480 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  g) ){.        re
12490 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
124a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
124b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69  }.      if( nOri
124c0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
124d0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
124e0 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20       nOrig--;.  
124f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
12500 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
12510 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
12520 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74  [36]);.      nPt
12530 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
12540 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
12550 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67  O(pBt, nOrig)+pg
12560 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a  sz/5)/(pgsz/5);.
12570 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72        nFin = nOr
12580 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
12590 72 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20  rmap;.      if( 
125a0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
125b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
125c0 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin<=PENDING_BY
125d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
125e0 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
125f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
12600 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
12610 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
12620 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
12630 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
12640 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  .        nFin--;
12650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12660 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
12670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12680 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
12690 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29  mStep(pBt, nFin)
126a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
126b0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
126c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
126d0 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  nFin==0 || pBt->
126e0 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69  nTrunc==0 || nFi
126f0 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b  n<=pBt->nTrunc);
12700 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12710 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
12720 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20   pBt->nTrunc && 
12730 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  nFin ){.        
12740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12750 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
12760 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
12770 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12780 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
12790 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
127a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
127b0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
127c0 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
127d0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
127e0 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
127f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
12800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12810 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
12820 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
12830 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
12840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12850 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20  ){.    *pnTrunc 
12860 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
12870 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d     pBt->nTrunc =
12880 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
12890 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
128a0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
128b0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
128c0 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a   rc;.}..#endif..
128d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
128e0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
128f0 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
12900 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
12910 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
12920 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
12930 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
12940 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
12950 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
12960 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
12970 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
12980 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
12990 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
129a0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
129b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
129c0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
129d0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
129e0 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
129f0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
12a00 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
12a10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
12a20 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
12a30 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
12a40 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
12a50 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
12a60 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
12a70 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
12a80 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
12a90 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
12aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12ab0 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
12ac0 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
12ad0 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
12ae0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
12af0 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
12b00 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
12b10 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
12b20 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
12b30 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
12b40 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
12b50 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
12b60 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
12b70 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68  eCommit() for th
12b80 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
12b90 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
12ba0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
12bb0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
12bc0 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
12bd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
12be0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
12bf0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
12c00 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
12c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12c20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
12c30 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
12c40 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
12c50 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
12c60 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
12c70 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
12c80 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
12c90 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
12ca0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
12cb0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
12cc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12cd0 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
12ce0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
12cf0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
12d00 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
12d10 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
12d20 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
12d30 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
12d40 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
12d50 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
12d60 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
12d70 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
12d80 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
12d90 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
12da0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
12db0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
12dc0 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
12dd0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
12de0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
12df0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
12e00 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
12e10 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
12e20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12e30 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
12e40 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
12e50 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
12e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12e70 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
12e80 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
12e90 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
12ea0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
12eb0 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b  Pgno nTrunc = 0;
12ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12ed0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70  eEnter(p);.    p
12ee0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
12ef0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12f00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12f10 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
12f20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
12f30 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
12f40 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
12f50 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
12f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12f80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12f90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12fb0 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
12fc0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
12fd0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
12fe0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
12ff0 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20   nTrunc, 0);.   
13000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13010 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
13020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13030 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
13040 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
13050 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
13060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13070 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
13080 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
13090 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
130a0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
130b0 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
130c0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
130d0 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
130e0 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
130f0 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
13100 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
13110 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
13120 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
13130 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68  ne did.** all th
13140 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
13150 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
13160 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
13170 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
13180 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
13190 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
131a0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
131b0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
131c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
131d0 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
131e0 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
131f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
13200 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65  .** (which cause
13210 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
13220 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
13230 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
13240 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
13250 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
13260 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
13270 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
13280 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
13290 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
132a0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
132b0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
132c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
132d0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
132e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
132f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
13300 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
13310 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13320 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13330 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
13340 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
13350 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
13360 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13370 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
13380 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
13390 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
133a0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
133b0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
133c0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
133d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
133e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
133f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
13400 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13410 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13420 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
13430 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
13440 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
13450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13460 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
13470 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
13480 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
134a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
134b0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
134c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
134d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
134e0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
134f0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
13500 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c  t = 0;.  }.  unl
13510 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
13520 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
13530 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
13540 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
13550 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
13560 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13570 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
13580 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
13590 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
135a0 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
135b0 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
135c0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
135d0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
135e0 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
135f0 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
13600 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
13610 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
13620 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
13630 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
13640 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   ){.    pBt->nTr
13650 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
13660 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
13670 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
13680 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
13690 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
136a0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
136b0 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64   /* Set the hand
136c0 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e  les current tran
136d0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
136e0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
136f0 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20  unlock.  ** the 
13700 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
13710 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
13720 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
13730 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13740 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  */.  p->inTrans 
13750 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
13760 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13770 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
13780 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13790 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
137a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
137b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
137c0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
137d0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
137e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
137f0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
13800 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
13810 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13820 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
13830 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13840 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
13850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
13870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
13880 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
13890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
138a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
138b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
138c0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
138d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
138e0 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
138f0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
13900 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
13910 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
13920 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
13930 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
13940 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
13950 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
13960 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
13970 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
13980 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
13990 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
139a0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
139b0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
139c0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
139d0 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
139e0 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
139f0 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
13a00 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
13a10 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
13a20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
13a30 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
13a40 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
13a50 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
13a60 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
13a70 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
13a80 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
13a90 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
13aa0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
13ab0 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
13ac0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
13ad0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
13ae0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
13af0 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
13b00 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
13b10 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
13b20 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
13b30 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
13b40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13b50 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
13b60 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
13b70 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
13b80 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
13b90 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
13ba0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
13bb0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
13bc0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
13bd0 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
13be0 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
13bf0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
13c00 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
13c10 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
13c20 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
13c30 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
13c40 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
13c50 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
13c60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13c70 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
13c80 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
13c90 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
13ca0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
13cb0 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
13cc0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
13cd0 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
13ce0 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
13cf0 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
13d00 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
13d10 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
13d20 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
13d30 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
13d40 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
13d50 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
13d60 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
13d70 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
13d80 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
13d90 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
13da0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
13db0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
13dc0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
13dd0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
13de0 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
13df0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
13e00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13e10 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
13e20 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
13e30 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
13e40 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6c 65 61  pNext){.    clea
13e50 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
13e60 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74  p);.    p->eStat
13e70 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
13e80 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20  ;.    p->skip = 
13e90 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73  errCode;.  }.  s
13ea0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13eb0 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
13ec0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
13ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
13ee0 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
13ef0 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
13f00 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
13f10 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
13f20 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
13f30 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
13f40 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
13f50 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13f60 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
13f70 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
13f80 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
13f90 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
13fa0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
13fb0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
13fc0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
13fd0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
13fe0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
13ff0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
14000 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
14010 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
14020 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
14030 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
14040 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14050 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
14060 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
14070 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14080 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14090 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76  ->db;.  rc = sav
140a0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
140b0 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
140c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
140d0 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72  ED_CACHE.  if( r
140e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
140f0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
14100 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74   horrible situat
14110 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61  ion. An IO or ma
14120 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
14130 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  ured whilst.    
14140 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
14150 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
14160 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
14170 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
14180 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
14190 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
141a0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
141b0 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
141c0 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
141d0 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
141e0 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
141f0 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
14200 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
14210 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
14220 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
14230 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
14240 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
14250 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
14260 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
14270 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
14280 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
14290 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
142a0 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
142b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
142c0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
142d0 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
142e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
142f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14300 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
14310 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  s(p);..  if( p->
14320 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
14330 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
14340 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  rc2;..#ifndef SQ
14350 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14360 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54  CUUM.    pBt->nT
14370 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  runc = 0;.#endif
14380 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
14390 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
143a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
143b0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
143c0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
143d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
143e0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
143f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
14400 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
14410 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
14420 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
14430 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
14440 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
14450 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73  So.    ** call s
14460 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
14470 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
14480 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
14490 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
144a0 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
144b0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
144c0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
144d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
144e0 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
144f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14500 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14510 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
14520 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
14530 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
14540 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
14550 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
14560 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  NS_READ;.  }..  
14570 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
14580 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
14590 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
145a0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
145b0 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
145c0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
145d0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
145e0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
145f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14600 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
14610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d  .    }.  }..  p-
14620 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
14630 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e  _NONE;.  pBt->in
14640 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f  Stmt = 0;.  unlo
14650 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
14660 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
14670 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
14680 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14690 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
146a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
146b0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
146c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65  ransaction.  The
146d0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
146e0 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  can.** can be ro
146f0 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65  lled back indepe
14700 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
14710 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
14720 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61  .** You must sta
14730 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
14740 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
14750 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
14760 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61  n..** The subtra
14770 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
14780 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
14790 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
147a0 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69  saction.** commi
147b0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
147c0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65  ..**.** Only one
147d0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
147e0 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74  may be active at
147f0 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20   a time.  It is 
14800 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a  an error to try.
14810 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  ** to start a ne
14820 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  w subtransaction
14830 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74   if another subt
14840 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
14850 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a  ready active..**
14860 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
14870 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
14880 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
14890 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
148a0 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
148b0 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
148c0 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
148d0 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
148e0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
148f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
14900 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
14910 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
14920 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
14930 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
14940 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
14950 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
14960 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
14970 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
14980 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14990 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
149a0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
149b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
149c0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
149d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
149e0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
149f0 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  >db;.  if( (p->i
14a00 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
14a10 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53  ITE) || pBt->inS
14a20 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  tmt ){.    rc = 
14a30 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
14a40 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
14a50 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
14a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
14a70 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
14a80 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
14a90 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d  RITE );.    rc =
14aa0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
14ab0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
14ac0 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
14ad0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  in(pBt->pPager);
14ae0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
14af0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
14b00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14b10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b20 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
14b30 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62  the statment sub
14b40 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
14b50 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
14b60 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62  s.  If no.** sub
14b70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14b80 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61  ctive, this is a
14b90 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
14ba0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14bb0 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  tStmt(Btree *p){
14bc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
14bd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14be0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
14bf0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
14c00 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
14c10 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
14c20 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
14c30 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
14c40 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
14c50 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  Commit(pBt->pPag
14c60 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
14c70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14c80 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53  ;.  }.  pBt->inS
14c90 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  tmt = 0;.  sqlit
14ca0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14cb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14cc0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
14cd0 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65  the active state
14ce0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
14cf0 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74  ion.  If no subt
14d00 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
14d10 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75   active this rou
14d20 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14d30 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  .**.** All curso
14d40 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
14d50 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f  idated by this o
14d60 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
14d70 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65  ttempt.** to use
14d80 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77   a cursor that w
14d90 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
14da0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
14db0 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69   operation.** wi
14dc0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
14dd0 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
14de0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
14df0 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  ckStmt(Btree *p)
14e00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14e10 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
14e20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14e30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14e40 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
14e50 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
14e60 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
14e70 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
14e80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14e90 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
14ea0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
14eb0 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53  r);.    pBt->inS
14ec0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tmt = 0;.  }.  s
14ed0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14ee0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
14f00 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
14f10 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
14f20 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
14f30 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
14f40 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63  .  The act of ac
14f50 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72  quiring a cursor
14f60 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63   gets a read loc
14f70 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
14f80 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
14f90 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
14fa0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14fb0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
14fc0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
14fd0 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
14fe0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
14ff0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
15000 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
15010 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
15020 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
15030 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
15040 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
15050 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
15060 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
15070 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
15080 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
15090 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
150a0 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
150b0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
150c0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
150d0 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
150e0 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
150f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
15100 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
15110 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
15120 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
15130 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
15140 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
15150 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
15160 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
15170 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
15180 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
15190 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
151a0 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
151b0 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
151c0 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
151d0 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
151e0 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
151f0 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
15200 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
15210 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
15220 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
15230 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
15240 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
15250 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
15260 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
15270 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
15280 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
15290 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
152a0 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
152b0 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
152c0 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
152d0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
152e0 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
152f0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
15300 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
15310 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
15320 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
15330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
15340 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
15350 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
15380 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
153b0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
153c0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
153d0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
15400 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
15410 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
15420 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15440 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
15450 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
15460 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
15470 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15490 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
154a0 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rsor */.){.  int
154b0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
154c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
154d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
154e0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
154f0 28 70 29 20 29 3b 0a 20 20 69 66 28 20 77 72 46  (p) );.  if( wrF
15500 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  lag ){.    if( p
15510 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
15520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15530 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
15540 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
15550 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
15560 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20  able, 0, 0) ){. 
15570 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15580 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  TE_LOCKED;.    }
15590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d  .  }..  if( pBt-
155a0 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
155b0 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
155c0 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20  WithRetry(p);.  
155d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
155e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
155f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15600 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
15610 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b  nly && wrFlag ){
15620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15630 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
15640 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
15650 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
15660 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  o)iTable;.  if( 
15670 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67  iTable==1 && pag
15680 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
15690 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  >pPager)==0 ){. 
156a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
156b0 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63  MPTY;.    goto c
156c0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
156d0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63  eption;.  }.  rc
156e0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
156f0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
15700 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
15710 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
15720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15730 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
15740 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
15750 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
15760 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
15770 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
15780 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
15790 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
157a0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c   ** variables, l
157b0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
157c0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
157d0 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70   list and set *p
157e0 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f  pCur (the.  ** o
157f0 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74  utput argument t
15800 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29  o this function)
15810 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  ..  */.  pCur->p
15820 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
15830 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
15840 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
15850 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
15860 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c  r->wrFlag = wrFl
15870 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
15880 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
15890 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
158a0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
158b0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
158c0 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
158d0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
158e0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
158f0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
15900 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
15910 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63  TE_OK;..create_c
15920 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a  ursor_exception:
15930 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
15940 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75  Cur->pPage);.  u
15950 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15960 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
15970 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
15980 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
15990 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159c0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
159d0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15a00 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
15a10 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
15a20 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
15a50 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
15a60 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
15a70 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
15a80 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
15a90 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
15aa0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
15ab0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
15ac0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
15af0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
15b00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
15b10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15b20 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
15b30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
15b40 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
15b50 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
15b60 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
15b70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15b80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15b90 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
15ba0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
15bb0 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ze(){.  return s
15bc0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b  izeof(BtCursor);
15bd0 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  .}..../*.** Clos
15be0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
15bf0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
15c00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15c10 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
15c20 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
15c30 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
15c40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15c50 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
15c60 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
15c70 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
15c80 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
15c90 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
15ca0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
15cb0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
15cc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15cd0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
15ce0 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72 65   pBt->db = pBtre
15cf0 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61 72  e->db;.    clear
15d00 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15d10 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
15d20 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
15d30 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
15d40 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
15d50 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
15d60 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
15d70 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
15d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15d90 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
15da0 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
15db0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
15dc0 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
15dd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
15de0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 75  r->pPage);.    u
15df0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15e00 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
15e10 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
15e20 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
15e30 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
15e40 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
15e50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15e60 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
15e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
15e90 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
15ea0 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
15eb0 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
15ec0 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
15ed0 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
15ee0 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
15ef0 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
15f00 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  e Btree..*/.void
15f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
15f20 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
15f30 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
15f40 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
15f50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
15f60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
15f70 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65   );.  memcpy(pTe
15f80 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a  mpCur, pCur, siz
15f90 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70  eof(*pCur));.  p
15fa0 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  TempCur->pNext =
15fb0 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e   0;.  pTempCur->
15fc0 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28  pPrev = 0;.  if(
15fd0 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65   pTempCur->pPage
15fe0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
15ff0 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75 72  agerRef(pTempCur
16000 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ->pPage->pDbPage
16010 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
16020 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61  Delete a tempora
16030 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20 61  ry cursor such a
16040 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74 68  s was made by th
16050 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72  e CreateTemporar
16060 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e  yCursor().** fun
16070 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ction above..*/.
16080 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
16090 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73  eReleaseTempCurs
160a0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
160b0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
160c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
160d0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
160e0 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20  ur->pPage ){.   
160f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
16100 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ef(pCur->pPage->
16110 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
16120 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16130 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
16140 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
16150 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
16160 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
16170 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
16180 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
16190 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
161a0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
161b0 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
161c0 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
161d0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
161e0 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
161f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
16200 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
16210 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
16220 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
16230 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
16240 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
16250 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
16260 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
16270 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
16280 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
16290 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
162a0 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
162b0 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
162c0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
162d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
162e0 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
162f0 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
16300 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
16310 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
16320 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
16330 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
16340 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
16350 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
16360 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
16370 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
16380 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
16390 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
163a0 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
163b0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
163c0 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
163d0 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
163e0 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
163f0 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
16400 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
16410 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
16420 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
16430 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
16440 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
16450 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
16460 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
16470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
16480 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
16490 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
164a0 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  idx, &info);.   
164b0 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
164c0 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
164d0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
164e0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
164f0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
16500 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
16510 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
16520 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
16530 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
16540 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
16550 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
16560 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
16570 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
16580 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
16590 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
165a0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
165b0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ze==0 ){.      s
165c0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
165d0 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
165e0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
165f0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
16600 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
16610 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
16620 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
16630 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
16640 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
16650 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
16660 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
16670 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
16680 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
16690 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
166a0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
166b0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
166c0 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
16700 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
16710 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  \.    sqlite3Btr
16750 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
16760 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
16770 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dx, &pCur->info)
16780 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20  ;         \.    
16790 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
167a0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16820 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
16830 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
16870 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
16880 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
16890 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
168a0 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
168b0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
168c0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
168d0 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
168e0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
168f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
16900 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
16910 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
16920 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
16930 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
16940 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
16950 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
16960 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
16970 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
16980 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
16990 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
169a0 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
169b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
169c0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
169d0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
169e0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
169f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
16a00 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
16a10 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
16a20 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
16a30 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
16a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
16a60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16a70 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
16a80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16a90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
16aa0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
16ab0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16ac0 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
16ad0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16ae0 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
16af0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
16b00 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
16b10 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20  fo.nKey;.    }. 
16b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
16b30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
16b40 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
16b50 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
16b60 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
16b70 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
16b80 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
16b90 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  o.  Always retur
16ba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
16bb0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
16bc0 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65  ossible.  If the
16bd0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63   cursor is not c
16be0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
16bf0 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
16c00 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70   (which can happ
16c10 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
16c20 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   if.** the datab
16c30 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68  ase is empty) th
16c40 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  en *pSize is set
16c50 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
16c60 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
16c70 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
16c80 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
16c90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
16ca0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
16cb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
16cc0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
16cd0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
16ce0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
16d00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
16d10 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
16d20 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
16d30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
16d40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
16d50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
16d60 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
16d70 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e    /* Not pointin
16d80 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74  g at a valid ent
16d90 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20  ry - set *pSize 
16da0 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a  to 0. */.      *
16db0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
16dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
16dd0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
16de0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
16df0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
16e00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16e20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
16e30 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
16e40 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
16e50 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
16e60 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
16e70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
16e80 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
16e90 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
16ea0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
16eb0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
16ec0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
16ed0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
16ee0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
16ef0 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
16f00 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
16f10 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
16f20 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
16f30 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
16f40 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
16f50 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
16f60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
16f70 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
16f80 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  se:.**.** Unless
16f90 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55   pPgnoNext is NU
16fa0 4c 4c 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d  LL, the page num
16fb0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
16fc0 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
16fd0 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
16fe0 6c 69 73 74 20 69 73 20 77 72 69 74 74 65 6e 20  list is written 
16ff0 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
17000 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69  f page ovfl.** i
17010 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
17020 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69  in its linked li
17030 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
17040 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
17050 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
17060 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70  is not NULL, *pp
17070 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74  Page is set to t
17080 68 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64  he MemPage* hand
17090 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f  le.** for page o
170a0 76 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79  vfl. The underly
170b0 69 6e 67 20 70 61 67 65 72 20 70 61 67 65 20 6d  ing pager page m
170c0 61 79 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ay have been req
170d0 75 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  uested.** with t
170e0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
170f0 67 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61  g set, so the pa
17100 67 65 20 64 61 74 61 20 61 63 63 65 73 73 61 62  ge data accessab
17110 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68  le via.** this h
17120 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65  andle may not be
17130 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   trusted..*/.sta
17140 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
17150 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
17160 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e  red *pBt, .  Pgn
17170 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
17180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65            /* Ove
17190 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20  rflow page */.  
171a0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
171b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
171c0 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
171d0 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  dle */.  Pgno *p
171e0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
171f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
17200 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
17210 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
17220 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
17230 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
17240 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17250 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
17260 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f  x) );.  /* One o
17270 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74  f these must not
17280 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77   be NULL. Otherw
17290 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68  ise, why call th
172a0 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a  is function? */.
172b0 20 20 61 73 73 65 72 74 28 70 70 50 61 67 65 20    assert(ppPage 
172c0 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  || pPgnoNext);..
172d0 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78    /* If pPgnoNex
172e0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
172f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17300 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f   being called to
17310 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d   obtain.  ** a M
17320 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63  emPage* referenc
17330 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d  e only. No page-
17340 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
17350 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
17360 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f   */.  if( !pPgno
17370 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Next ){.    retu
17380 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  rn sqlite3BtreeG
17390 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
173a0 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
173b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
173c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
173d0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
173e0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
173f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
17400 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
17410 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
17420 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
17430 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
17440 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
17450 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
17460 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
17470 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
17480 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
17490 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
174a0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
174b0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
174c0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
174d0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
174e0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
174f0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
17500 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
17510 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
17520 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
17530 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
17540 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
17550 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
17560 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
17570 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
17580 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
17590 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
175a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
175b0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
175c0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61    if( iGuess<=pa
175d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
175e0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
175f0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
17600 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
17610 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
17620 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17650 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
17660 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17670 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
17680 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
17690 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
176a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
176b0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
176c0 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  ext==0 || ppPage
176d0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
176e0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  *pPage = 0;..   
176f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17700 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
17710 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78  vfl, &pPage, nex
17720 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72  t!=0);.    asser
17730 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
17740 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20  || pPage==0);.  
17750 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26    if( next==0 &&
17760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17770 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
17780 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
17790 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Data);.    }..  
177a0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
177b0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
177c0 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65  pPage;.    }else
177d0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
177e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
177f0 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65  }.  }.  *pPgnoNe
17800 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65  xt = next;..  re
17810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17820 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
17830 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
17840 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
17850 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
17860 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
17870 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17880 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
17890 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
178a0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
178b0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
178c0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
178d0 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
178e0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
178f0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
17900 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
17910 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
17920 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
17930 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
17940 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
17950 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
17960 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
17970 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
17980 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
17990 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
179a0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
179b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
179c0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
179d0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
179e0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
179f0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
17a00 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
17a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
17a20 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
17a30 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
17a40 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
17a50 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17a60 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
17a70 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
17a80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17a90 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
17aa0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
17ad0 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
17ae0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
17af0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
17b00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
17b10 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
17b20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
17b30 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
17b40 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
17b50 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
17b60 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
17b70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
17b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17b90 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
17ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17bb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17bc0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17bd0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
17be0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
17bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17c00 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
17c10 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
17c20 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
17c30 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
17c40 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
17c50 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
17c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17c70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17c80 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
17c90 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
17ca0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
17cb0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
17cc0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
17cd0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
17ce0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20  pointing to. If 
17cf0 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d  the eOp.** param
17d00 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20  eter is 0, this 
17d10 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
17d20 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64  ion (data copied
17d30 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20   into.** buffer 
17d40 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20  pBuf). If it is 
17d50 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74  non-zero, a writ
17d60 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66  e (data copied f
17d70 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  rom.** buffer pB
17d80 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  uf)..**.** A tot
17d90 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
17da0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
17db0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
17dc0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
17dd0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
17de0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
17df0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
17e00 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
17e10 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74   not make a dist
17e20 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20  inction between 
17e30 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a  key and data..**
17e40 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f   It just reads o
17e50 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66  r writes bytes f
17e60 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20  rom the payload 
17e70 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68  area.  Data migh
17e80 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20  t .** appear on 
17e90 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72  the main page or
17ea0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
17eb0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
17ec0 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73  erflow .** pages
17ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
17ee0 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c  tCursor.isIncrbl
17ef0 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
17f00 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75   set, and the cu
17f10 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20  rrent.** cursor 
17f20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
17f30 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
17f40 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63  pages, this func
17f50 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  tion.** allocate
17f60 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  s space for and 
17f70 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73  lazily popluates
17f80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
17f90 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68  ge-list .** cach
17fa0 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
17fb0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75  r.aOverflow). Su
17fc0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
17fd0 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65  se this.** cache
17fe0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
17ff0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
18000 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66   offset more eff
18010 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
18020 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
18030 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
18040 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
18050 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
18060 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
18070 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
18080 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
18090 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
180a0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
180b0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
180c0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
180d0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
180e0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
180f0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
18100 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
18110 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
18120 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
18130 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
18140 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
18150 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
18160 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
18170 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
18180 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
18190 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
181a0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
181b0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
181c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
181d0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
181e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
181f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
18200 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
18210 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
18220 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20   int offset,    
18230 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
18240 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
18250 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
18260 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
18270 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
18280 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
18290 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
182a0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
182b0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
182c0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
182d0 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20  .  int skipKey, 
182e0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
182f0 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61  t begins at data
18300 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
18310 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20   */.  int eOp   
18320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
18330 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
18340 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
18350 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
18360 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
18370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18380 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
18390 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
183a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
183b0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
183c0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70  ;     /* Btree p
183d0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63  age of current c
183e0 75 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20  ursor entry */. 
183f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
18420 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
18430 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
18440 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
18450 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
18460 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18470 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18480 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18490 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
184a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  l );.  assert( o
184b0 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
184c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
184d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
184e0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
184f0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
18500 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
18510 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
18520 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
18530 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
18540 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e  y ? 0 : pCur->in
18550 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28  fo.nKey);..  if(
18560 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
18570 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a  offset += nKey;.
18580 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74    }.  if( offset
18590 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
185a0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a  ->info.nData ){.
185b0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
185c0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
185d0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
185e0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
185f0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
18600 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18610 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
18620 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
18630 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
18640 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
18650 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
18660 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
18670 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
18680 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
18690 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
186a0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
186b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
186c0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
186d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
186e0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
186f0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
18700 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
18710 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
18720 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
18730 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
18740 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
18750 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
18760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
18770 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
18780 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
18790 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
187a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
187b0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
187c0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  .    const int o
187d0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
187e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
187f0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
18800 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
18810 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
18820 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
18830 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
18840 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
18850 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
18860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18870 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
18880 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
18890 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
188a0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
188b0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
188c0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
188d0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
188e0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
188f0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
18900 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
18910 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
18920 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
18930 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
18940 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
18950 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
18960 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
18970 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
18980 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
18990 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
189a0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
189b0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
189c0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
189d0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
189e0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
189f0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
18a00 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
18a10 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
18a20 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
18a30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
18a40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
18a50 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
18a60 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
18a70 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
18a80 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
18a90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
18aa0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
18ab0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
18ac0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
18ad0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
18ae0 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
18af0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
18b00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18b10 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18b20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
18b30 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
18b40 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
18b50 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
18b60 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
18b70 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
18b80 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
18b90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
18ba0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
18bb0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
18bc0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
18bd0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
18be0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
18bf0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
18c00 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
18c10 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
18c20 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
18c30 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18c40 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
18c50 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
18c60 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
18c70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18c80 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
18c90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
18ca0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
18cb0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
18cc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
18cd0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
18ce0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
18cf0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
18d00 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
18d10 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
18d20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18d30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18d40 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
18d50 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
18d60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18d70 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
18d80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
18d90 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
18da0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
18db0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
18dc0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
18dd0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
18de0 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
18df0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
18e00 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
18e10 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
18e20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
18e30 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
18e40 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
18e50 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
18e60 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
18e70 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
18e80 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
18e90 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
18ea0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
18eb0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
18ec0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
18ed0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
18ee0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
18ef0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
18f00 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
18f10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18f20 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18f30 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
18f40 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
18f50 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18f60 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
18f70 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
18f80 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18f90 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
18fa0 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
18fb0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
18fc0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
18fd0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
18fe0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
18ff0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
19000 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
19010 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
19020 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
19030 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
19040 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
19050 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
19060 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
19070 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
19080 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
19090 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
190a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
190b0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
190c0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
190d0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
190e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
190f0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
19100 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
19110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
19120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
19140 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
19150 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
19160 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
19170 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
19180 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
19190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
191a0 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
191b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
191c0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
191d0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
191e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
191f0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
19200 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
19210 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
19220 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
19230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
19240 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
19250 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
19260 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
19270 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
19280 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
19290 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
192a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
192b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
192c0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
192d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
192e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
192f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
19310 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
19320 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
19330 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
19340 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
19350 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
19360 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
19370 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
19380 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
19390 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
193a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
193b0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
193c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
193d0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
193e0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
193f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19400 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
19410 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
19420 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
19430 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
19440 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
19450 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19460 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
19470 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
19480 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19490 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
194a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
194b0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
194c0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
194d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
194e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
194f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19500 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19520 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
19530 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
19540 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
19550 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19560 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19580 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
19590 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
195a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
195b0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
195c0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
195d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
195e0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
195f0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
19600 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
19610 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b  ar*)pBuf, 0, 0);
19620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19640 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
19650 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19660 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
19670 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
19680 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
19690 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
196a0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
196b0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
196c0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
196d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
196e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
196f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
19700 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
19710 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
19720 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
19730 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
19740 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
19750 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
19760 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
19770 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
19780 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19790 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
197a0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
197b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
197c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
197d0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
197e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
197f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
19800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19810 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
19820 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19830 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19840 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
19850 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
19860 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
19870 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19880 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19890 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
198a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
198b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
198c0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  >pPage!=0 );.   
198d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
198e0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
198f0 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
19900 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
19910 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
19920 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
19930 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a  t, pBuf, 1, 0);.
19940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19960 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
19970 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
19980 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
19990 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
199a0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
199b0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
199c0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
199d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
199e0 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
199f0 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
19a00 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
19a10 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
19a20 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
19a30 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
19a40 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
19a50 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
19a60 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
19a70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
19a80 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
19a90 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
19aa0 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
19ab0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
19ac0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19ad0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
19ae0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
19af0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
19b00 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
19b10 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
19b20 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
19b30 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
19b40 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
19b50 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
19b60 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
19b70 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
19b80 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
19b90 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
19ba0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
19bb0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
19bc0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
19bd0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
19be0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
19bf0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
19c00 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
19c10 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
19c20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
19c30 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
19c40 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
19c50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
19c60 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
19c70 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
19c80 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
19c90 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
19ca0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
19cb0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
19cc0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
19cd0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
19ce0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
19cf0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
19d00 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
19d10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19d20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
19d30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19d40 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
19d50 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
19d60 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
19d70 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
19d80 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19d90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19da0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
19db0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
19dc0 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
19dd0 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
19de0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
19df0 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
19e00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
19e10 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
19e20 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
19e30 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f   nKey;.  int nLo
19e40 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
19e50 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
19e60 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
19e70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19e80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19e90 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
19ea0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19eb0 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
19ec0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
19ed0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19ee0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
19ef0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
19f00 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
19f10 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
19f20 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
19f30 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
19f40 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
19f50 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
19f60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
19f70 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
19f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
19f90 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
19fa0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
19fb0 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
19fc0 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
19fd0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
19fe0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
19ff0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
1a000 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
1a010 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1a020 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b     if( nLocal>nK
1a030 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  ey ){.      nLoc
1a040 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d  al = nKey;.    }
1a050 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
1a060 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
1a070 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
1a080 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
1a090 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
1a0a0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
1a0b0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
1a0c0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
1a0d0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
1a0e0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
1a0f0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
1a100 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
1a110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
1a120 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
1a130 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
1a140 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
1a150 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
1a160 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
1a170 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
1a180 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
1a190 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
1a1a0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
1a1b0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
1a1c0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
1a1d0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
1a1e0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
1a1f0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
1a200 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
1a210 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
1a220 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
1a230 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
1a240 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
1a250 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
1a260 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
1a270 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
1a280 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
1a290 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
1a2a0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
1a2b0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
1a2c0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1a2d0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
1a2e0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1a2f0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1a300 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1a310 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1a320 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1a330 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a340 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1a350 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
1a360 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1a370 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
1a380 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e   return 0;.}.con
1a390 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1a3a0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
1a3b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1a3c0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
1a3d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1a3e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a3f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1a400 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a410 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
1a420 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
1a430 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
1a440 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
1a450 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
1a460 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a470 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
1a480 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
1a490 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
1a4a0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
1a4b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
1a4c0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
1a4d0 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e to..*/.static 
1a4e0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
1a4f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a500 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
1a510 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
1a520 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d  e *pNewPage;.  M
1a530 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65  emPage *pOldPage
1a540 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1a550 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
1a560 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a570 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a590 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a5a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
1a5b0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1a5c0 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
1a5d0 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d  &pNewPage, pCur-
1a5e0 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  >pPage);.  if( r
1a5f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1a600 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61   pNewPage->idxPa
1a610 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78  rent = pCur->idx
1a620 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70  ;.  pOldPage = p
1a630 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f  Cur->pPage;.  pO
1a640 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74  ldPage->idxShift
1a650 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1a660 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20  age(pOldPage);. 
1a670 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
1a680 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1a690 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
1a6a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1a6b0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1a6c0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
1a6d0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
1a6e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a6f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1a700 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1a710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a720 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1a730 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1a740 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
1a750 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
1a760 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
1a770 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
1a780 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
1a790 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
1a7a0 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
1a7b0 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
1a7c0 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
1a7d0 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
1a7e0 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
1a7f0 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
1a800 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
1a810 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
1a820 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
1a830 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
1a840 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
1a850 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
1a860 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
1a870 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
1a880 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
1a890 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1a8a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1a8b0 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
1a8c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1a8d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1a8e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 72  mutex) );.  pPar
1a8f0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
1a900 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
1a910 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
1a920 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
1a930 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
1a940 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
1a950 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
1a960 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
1a970 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
1a980 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1a990 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
1a9a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1a9b0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1a9c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1a9d0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1a9e0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1a9f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1aa00 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1aa10 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1aa20 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1aa30 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1aa40 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1aa50 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1aa60 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1aa70 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1aa80 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1aa90 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1aaa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1aab0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1aac0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1aad0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1aae0 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67  Parent;.  MemPag
1aaf0 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
1ab00 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73  idxParent;..  as
1ab10 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ab20 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1ab30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ab40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1ab50 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20  ALID );.  pPage 
1ab60 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1ab70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
1ab80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
1ab90 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1aba0 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 3b  otPage(pPage) );
1abb0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
1abc0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
1abd0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1abe0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1abf0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2d 3e 6e  Page->pDbPage->n
1ac00 52 65 66 3e 30 20 29 3b 0a 20 20 69 64 78 50 61  Ref>0 );.  idxPa
1ac10 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64  rent = pPage->id
1ac20 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  xParent;.  sqlit
1ac30 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
1ac40 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
1ac50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1ac60 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
1ac70 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70  e = pParent;.  p
1ac80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ac90 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1aca0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73  idNKey = 0;.  as
1acb0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
1acc0 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
1acd0 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
1ace0 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
1acf0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1ad00 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
1ad10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1ad20 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
1ad30 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1ad40 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
1ad50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ad60 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
1ad70 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1ad80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ad90 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
1ada0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1adb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1adc0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
1add0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
1ade0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1adf0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
1ae00 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
1ae10 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1ae20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1ae30 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
1ae40 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1ae50 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1ae60 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
1ae70 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
1ae80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ae90 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
1aea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
1aeb0 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
1aec0 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
1aed0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1aee0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
1aef0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
1af00 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 69  Root && pRoot->i
1af10 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  sInit ){.    /* 
1af20 49 66 20 74 68 65 20 70 61 67 65 20 74 68 65 20  If the page the 
1af30 63 75 72 73 6f 72 20 69 73 20 63 75 72 72 65 6e  cursor is curren
1af40 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1af50 69 73 20 66 75 6c 6c 79 20 69 6e 69 74 69 61 6c  is fully initial
1af60 69 7a 65 64 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ized,.    ** the
1af70 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  n the root page 
1af80 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
1af90 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4d 65  following the Me
1afa0 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 0a 20 20  mPage.pParent.  
1afb0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 2e 20 54    ** pointers. T
1afc0 68 69 73 20 69 73 20 66 61 73 74 65 72 20 74 68  his is faster th
1afd0 61 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  an requesting a 
1afe0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1aff0 20 72 6f 6f 74 0a 20 20 20 20 2a 2a 20 70 61 67   root.    ** pag
1b000 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
1b010 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   layer..    */. 
1b020 20 20 20 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d     while( pRoot-
1b030 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  >pParent ){.    
1b040 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1b050 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53  >isInit==PAGE_IS
1b060 49 4e 49 54 5f 46 55 4c 4c 20 29 3b 0a 20 20 20  INIT_FULL );.   
1b070 20 20 20 70 52 6f 6f 74 20 3d 20 70 52 6f 6f 74     pRoot = pRoot
1b080 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d  ->pParent;.    }
1b090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1b0a0 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45  ot->isInit==PAGE
1b0b0 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 3b 0a  _ISINIT_FULL );.
1b0c0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 21 3d 70      if( pRoot!=p
1b0d0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
1b0e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b0f0 52 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  Ref(pRoot->pDbPa
1b100 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
1b110 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
1b120 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ge);.      pCur-
1b130 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a  >pPage = pRoot;.
1b140 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b150 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1b160 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1b170 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1b180 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1b190 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20  t, &pRoot, 0)). 
1b1a0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
1b1b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1b1c0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1b1d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b1e0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1b1f0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
1b200 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
1b210 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 61  = pRoot;.  }.  a
1b220 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1b230 67 65 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ge->pgno==pCur->
1b240 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43  pgnoRoot );.  pC
1b250 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
1b260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1b270 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
1b280 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
1b290 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1b2a0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
1b2b0 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
1b2c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1b2d0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
1b2e0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1b2f0 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
1b300 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
1b310 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
1b320 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
1b330 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1b340 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
1b350 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1b360 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
1b370 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1b380 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
1b390 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  );.  }.  pCur->e
1b3a0 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e  State = ((pCur->
1b3b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pPage->nCell>0)?
1b3c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1b3d0 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1b3e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b3f0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1b400 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1b410 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
1b420 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1b430 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
1b440 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1b450 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
1b460 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
1b470 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
1b480 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
1b490 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
1b4a0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
1b4b0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1b4c0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
1b4d0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
1b4e0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1b4f0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1b500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1b510 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1b520 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b530 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b550 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b560 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1b570 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1b580 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1b590 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1b5a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b5b0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1b5c0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1b5d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1b5e0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1b5f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1b600 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72  ur->idx));.    r
1b610 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1b620 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1b630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b640 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1b650 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1b660 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1b670 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1b680 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1b690 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1b6a0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1b6b0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1b6c0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1b6d0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1b6e0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1b6f0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1b700 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1b710 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1b720 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1b730 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1b740 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1b750 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1b760 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1b770 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1b780 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1b790 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1b7a0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1b7b0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1b7c0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1b7d0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1b7e0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1b7f0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1b800 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1b810 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1b820 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1b830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1b840 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1b850 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b860 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b880 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b890 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1b8a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1b8b0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1b8c0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1b8d0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1b8e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1b8f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1b900 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1b910 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1b920 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1b930 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1b940 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1b950 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1b970 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1b980 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43  Cell - 1;.    pC
1b990 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1b9a0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1b9b0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
1b9c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b9d0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1b9e0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
1b9f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1ba00 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1ba10 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1ba20 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1ba30 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1ba40 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1ba50 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1ba60 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1ba70 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1ba80 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1ba90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1baa0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
1bab0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1bac0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1bad0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bae0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1baf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bb00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1bb10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1bb20 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1bb30 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1bb40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bb50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1bb60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1bb70 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1bb80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bb90 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1bba0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
1bbb0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1bbc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bbd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bbe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1bbf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
1bc00 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1bc10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1bc20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1bc30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1bc40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1bc50 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1bc60 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1bc70 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1bc80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1bc90 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1bca0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1bcb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1bcc0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1bcd0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1bce0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1bcf0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1bd00 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1bd10 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1bd20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1bd30 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1bd40 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1bd50 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1bd60 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1bd70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1bd80 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1bd90 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1bda0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1bdb0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1bdc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bdd0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
1bde0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1bdf0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1be00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1be10 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
1be20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1be30 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1be40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1be50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1be60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1be70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1be80 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1be90 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1bea0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1beb0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
1bec0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
1bed0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20  =SQLITE_OK;.    
1bee0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1bef0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1bf00 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1bf10 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1bf20 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
1bf30 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
1bf40 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
1bf50 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
1bf60 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1bf70 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1bf80 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
1bf90 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
1bfa0 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
1bfb0 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
1bfc0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1bfd0 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
1bfe0 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
1bff0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
1c000 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
1c010 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
1c020 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
1c030 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
1c040 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
1c050 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
1c060 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
1c070 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
1c080 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
1c090 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
1c0a0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
1c0b0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
1c0c0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
1c0d0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
1c0e0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1c0f0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1c100 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1c110 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
1c120 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
1c130 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
1c140 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
1c150 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
1c160 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
1c170 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c180 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1c190 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1c1a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1c1b0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1c1e0 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
1c1f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
1c200 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c210 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
1c220 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
1c230 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
1c240 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
1c250 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
1c260 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1c270 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1c280 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
1c2a0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
1c2b0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
1c2c0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
1c2d0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1c2e0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1c2f0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1c300 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
1c310 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
1c320 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
1c330 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1c340 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
1c350 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
1c360 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1c370 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1c380 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c390 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
1c3a0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1c3b0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c3d0 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
1c3e0 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
1c3f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1c400 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1c410 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1c420 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1c430 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1c440 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1c450 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
1c460 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1c470 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1c480 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c490 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1c4a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c4b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1c4c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1c4d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1c4e0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1c4f0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
1c500 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
1c510 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
1c520 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
1c530 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
1c540 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
1c550 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
1c560 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c570 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
1c580 69 64 4e 4b 65 79 20 26 26 20 70 43 75 72 2d 3e  idNKey && pCur->
1c590 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1c5a0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1c5b0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
1c5c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
1c5d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1c5e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c5f0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1c600 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
1c610 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
1c620 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1c630 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1c640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c650 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
1c660 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1c670 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1c680 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c690 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1c6a0 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
1c6b0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1c6c0 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49  ->isInit==PAGE_I
1c6d0 53 49 4e 49 54 5f 46 55 4c 4c 20 29 3b 0a 20 20  SINIT_FULL );.  
1c6e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1c6f0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1c700 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1c710 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1c720 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1c730 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1c740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c750 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1c760 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
1c770 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
1c780 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1c790 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1c7a0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1c7b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1c7c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1c7d0 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20     int c = -1;  
1c7e0 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69  /* pRes return i
1c7f0 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  f table is empty
1c800 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20   must be -1 */. 
1c810 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
1c820 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
1c830 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70  ll-1;.    if( !p
1c840 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1c850 70 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  pIdxKey==0 ){.  
1c860 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c870 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c880 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1c890 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1c8a0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
1c8b0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ){.      pCur->i
1c8c0 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65  dx = upr;.    }e
1c8d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1c8e0 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  >idx = (upr+lwr)
1c8f0 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  /2;.    }.    if
1c900 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72  ( lwr<=upr ) for
1c910 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1c920 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1c930 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1c940 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1c950 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1c960 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1c970 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  y = 1;.      if(
1c980 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1c990 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1c9a0 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1c9b0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1c9c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1c9d0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1c9e0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1c9f0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1ca00 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1ca10 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1ca20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1ca30 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1ca40 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1ca50 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1ca60 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
1ca70 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1ca80 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1ca90 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
1caa0 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1cab0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cac0 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
1cad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1cae0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1caf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1cb00 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
1cb10 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
1cb20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
1cb30 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1cb40 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76  {.        int av
1cb50 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ailable;.       
1cb60 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69   pCellKey = (voi
1cb70 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  d *)fetchPayload
1cb80 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c  (pCur, &availabl
1cb90 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, 0);.        n
1cba0 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e  CellKey = pCur->
1cbb0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
1cbc0 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65     if( available
1cbd0 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20  >=nCellKey ){.  
1cbe0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1cbf0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1cc00 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1cc10 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1cc20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1cc30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  {.          pCel
1cc40 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
1cc50 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29  lloc( nCellKey )
1cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1cc70 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
1cc80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1cc90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1cca0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1ccb0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1ccc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ccd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cce0 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
1ccf0 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69  , nCellKey, (voi
1cd00 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  d *)pCellKey);. 
1cd10 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
1cd20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1cd30 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20  mpare(nCellKey, 
1cd40 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1cd50 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
1cd60 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
1cd70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1cd80 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
1cd90 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1cda0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cdb0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
1cdc0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1cdd0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1cde0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1cdf0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
1ce00 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1ce10 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1ce20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1ce30 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1ce40 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1ce50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1ce60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ce70 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1ce80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ce90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cea0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1ceb0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1cec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ced0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1cee0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70  .        lwr = p
1cef0 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20  Cur->idx+1;.    
1cf00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cf10 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   upr = pCur->idx
1cf20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1cf30 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
1cf40 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1cf50 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1cf60 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Key;.        bre
1cf70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1cf80 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c    pCur->idx = (l
1cf90 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d  wr+upr)/2;.    }
1cfa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1cfb0 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1cfc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1cfd0 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53 49 4e 49  Init==PAGE_ISINI
1cfe0 54 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  T_FULL );.    if
1cff0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
1d000 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1d010 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1d020 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
1d030 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
1d040 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
1d050 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d060 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1d070 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d080 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1d090 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1d0a0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
1d0b0 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
1d0c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1d0d0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1d0e0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
1d0f0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1d100 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
1d110 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b  Res ) *pRes = c;
1d120 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d130 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
1d140 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1d150 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1d160 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20  >idx = lwr;.    
1d170 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1d180 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1d190 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1d1a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1d1b0 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
1d1c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1d1d0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1d1e0 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
1d1f0 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
1d200 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  rc;.}../*.** In 
1d210 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
1d220 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
1d230 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
1d240 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
1d250 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
1d260 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1d270 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
1d280 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
1d290 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
1d2a0 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
1d2b0 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
1d2c0 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74  the work..*/.int
1d2d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d2e0 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
1d2f0 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
1d300 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
1d310 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
1d320 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
1d330 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1d340 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
1d350 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
1d360 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
1d370 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1d380 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
1d390 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
1d3a0 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
1d3b0 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
1d3c0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1d3d0 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
1d3e0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
1d3f0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
1d400 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
1d410 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
1d420 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1d430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d440 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
1d450 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
1d460 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
1d470 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
1d480 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55  index key */.  U
1d490 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61 53  npackedRecord aS
1d4a0 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d  pace[16]; /* Tem
1d4b0 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78  p space for pIdx
1d4c0 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  Key - to avoid a
1d4d0 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66   malloc */..  if
1d4e0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 49  ( pKey ){.    pI
1d4f0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
1d500 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1d510 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
1d520 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
1d560 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
1d570 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
1d580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1d590 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
1d5a0 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
1d5b0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1d5c0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1d5d0 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
1d5e0 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
1d5f0 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
1d600 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1d610 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
1d620 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
1d630 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d640 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d650 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1d660 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1d670 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1d680 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
1d690 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
1d6a0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
1d6b0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
1d6c0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
1d6d0 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
1d6e0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1d6f0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
1d700 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
1d710 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
1d720 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
1d730 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
1d740 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
1d750 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1d760 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d770 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
1d780 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
1d790 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
1d7a0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
1d7b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
1d7c0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
1d7d0 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
1d7e0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
1d7f0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
1d800 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
1d810 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
1d820 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
1d830 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
1d840 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
1d850 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
1d860 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
1d870 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
1d880 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
1d890 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
1d8a0 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f  ndle for a curso
1d8b0 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  r..*/.sqlite3 *s
1d8c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d8d0 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73  rDb(const BtCurs
1d8e0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1d8f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d900 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1d910 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1d920 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75   );.  return pCu
1d930 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d  r->pBtree->db;.}
1d940 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1d950 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1d960 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
1d970 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1d980 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1d990 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1d9a0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1d9b0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1d9c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1d9d0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1d9e0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1d9f0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1da00 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1da10 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1da20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1da30 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
1da40 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1da50 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1da60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1da70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1da80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1da90 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1daa0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1dab0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1dac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dad0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1dae0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
1daf0 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  s!=0 );.  pPage 
1db00 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1db10 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1db20 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1db30 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1db40 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1db50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1db60 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
1db70 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1db80 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1db90 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1dba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1dbb0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1dbc0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
1dbd0 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47  age->isInit==PAG
1dbe0 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 3b  E_ISINIT_FULL );
1dbf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1dc00 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1dc10 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64  l );..  pCur->id
1dc20 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  x++;.  pCur->inf
1dc30 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1dc40 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1dc50 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
1dc60 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1dc70 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1dc80 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1dc90 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1dca0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1dcb0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1dcc0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1dcd0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1dce0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1dcf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1dd00 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1dd10 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1dd20 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1dd30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1dd40 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  o{.      if( sql
1dd50 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1dd60 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1dd70 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1dd80 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1dd90 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1dda0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1ddb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ddc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ddd0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1dde0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1ddf0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1de00 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1de10 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1de20 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1de30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1de40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1de50 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1de60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1de70 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
1de80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1de90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dea0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
1deb0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
1dec0 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
1ded0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1dee0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1def0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
1df00 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1df10 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
1df20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
1df30 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
1df40 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
1df50 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
1df60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1df70 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1df80 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1df90 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1dfa0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1dfb0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1dfc0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1dfd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1dfe0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1dff0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1e000 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1e010 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1e020 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
1e030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1e040 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1e050 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
1e060 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e070 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1e080 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e090 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1e0a0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1e0b0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1e0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e0d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1e0e0 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
1e0f0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
1e100 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1e110 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1e120 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1e130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e140 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1e150 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a  pCur->skip<0 ){.
1e160 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1e170 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1e180 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1e190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1e1a0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
1e1b0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1e1c0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
1e1d0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
1e1e0 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
1e1f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e200 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20  ur->idx>=0 );.  
1e210 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1e220 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1e230 65 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c  et4byte( findCel
1e240 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1e250 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  dx) );.    rc = 
1e260 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1e270 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
1e280 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1e290 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e2a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1e2b0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1e2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1e2d0 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29  ( pCur->idx==0 )
1e2e0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1e2f0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
1e300 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1e310 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1e320 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1e330 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
1e340 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
1e350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e370 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1e380 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1e390 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1e3a0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  r->pPage;.    }.
1e3b0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b      pCur->idx--;
1e3c0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1e3d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
1e3e0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1e3f0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1e400 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
1e410 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1e420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e430 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
1e440 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1e450 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e470 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
1e480 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e490 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1e4a0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
1e4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e4c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
1e4d0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
1e4e0 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
1e4f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
1e500 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1e510 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
1e520 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
1e530 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
1e540 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
1e550 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
1e560 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
1e570 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
1e580 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1e590 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
1e5a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e5b0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
1e5c0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
1e5d0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
1e5e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1e5f0 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
1e600 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
1e610 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
1e620 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
1e630 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
1e640 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
1e650 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
1e660 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
1e670 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
1e680 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
1e690 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
1e6a0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
1e6b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
1e6c0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
1e6d0 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
1e6e0 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
1e6f0 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
1e700 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
1e710 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
1e720 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
1e730 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
1e740 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
1e750 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
1e760 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
1e770 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
1e780 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e790 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
1e7a0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
1e7b0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
1e7c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
1e7d0 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
1e7e0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
1e7f0 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
1e800 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
1e810 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
1e820 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
1e830 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
1e840 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
1e850 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
1e860 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
1e870 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e880 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
1e890 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
1e8a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1e8b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e8c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1e8d0 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
1e8e0 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
1e8f0 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
1e900 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
1e910 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
1e920 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
1e930 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f  ;.  int n;     /
1e940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e950 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1e960 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20  t */.  int k;   
1e970 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1e980 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
1e990 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
1e9a0 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
1e9b0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
1e9c0 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
1e9d0 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  nk = 0;..  asser
1e9e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e9f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1ea00 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
1ea10 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e  pBt->pPage1;.  n
1ea20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1ea30 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1ea40 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
1ea50 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
1ea60 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1ea70 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
1ea80 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
1ea90 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
1eaa0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
1eab0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
1eac0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
1ead0 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
1eae0 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
1eaf0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
1eb00 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
1eb10 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
1eb20 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
1eb30 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
1eb40 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
1eb50 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
1eb60 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
1eb70 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
1eb80 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
1eb90 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
1eba0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
1ebb0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
1ebc0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1ebd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1ebe0 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
1ebf0 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65   && nearby<=page
1ec00 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1ec10 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1ec20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
1ec30 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
1ec40 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1ec50 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1ec60 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
1ec70 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1ec80 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
1ec90 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1eca0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ecb0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1ecc0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1ecd0 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
1ece0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
1ecf0 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
1ed00 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
1ed10 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
1ed20 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1ed30 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
1ed40 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
1ed50 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1ed60 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
1ed70 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
1ed80 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
1ed90 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
1eda0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1edb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1edc0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1edd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1ede0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1edf0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1ee00 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
1ee10 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1ee20 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
1ee30 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
1ee40 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
1ee50 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
1ee60 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
1ee70 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
1ee80 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
1ee90 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
1eea0 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
1eeb0 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
1eec0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
1eed0 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
1eee0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
1eef0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
1ef00 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
1ef10 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
1ef20 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1ef30 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
1ef40 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1ef50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ef60 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1ef70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1ef80 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
1ef90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1efa0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1efb0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
1efc0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
1efd0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1efe0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1eff0 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
1f000 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1f010 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
1f020 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
1f030 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
1f040 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
1f050 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
1f060 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
1f070 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
1f080 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
1f090 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
1f0a0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
1f0b0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
1f0c0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
1f0d0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
1f0e0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
1f0f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
1f100 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
1f110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1f120 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
1f130 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f140 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f150 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f160 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1f170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1f180 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f190 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1f1a0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
1f1b0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
1f1c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1f1d0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1f1e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1f1f0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1f200 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1f210 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1f220 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1f230 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1f240 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1f250 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1f260 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
1f270 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
1f280 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
1f290 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2 ){.        /*
1f2a0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
1f2b0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
1f2c0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1f2d0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
1f2e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1f2f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1f300 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f310 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
1f320 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f330 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
1f340 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
1f350 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
1f360 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
1f370 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
1f380 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
1f390 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
1f3a0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
1f3b0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
1f3c0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
1f3d0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
1f3e0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
1f3f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1f400 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
1f410 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
1f420 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1f430 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1f440 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1f450 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f460 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1f470 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f480 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f490 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f4a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f4c0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
1f4d0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1f4e0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1f4f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1f500 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1f510 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1f520 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1f530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f540 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
1f550 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1f560 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1f570 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1f580 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1f590 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1f5a0 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
1f5b0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1f5c0 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
1f5d0 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
1f5e0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
1f5f0 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
1f600 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
1f610 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
1f620 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
1f630 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1f640 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1f650 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
1f660 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
1f670 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
1f680 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
1f690 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1f6a0 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
1f6b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f6c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1f6d0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1f6e0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1f6f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f710 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f720 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f740 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f750 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
1f760 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1f770 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f790 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1f7a0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1f7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1f7c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f7d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1f7e0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
1f7f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1f800 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1f810 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1f820 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1f830 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
1f840 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1f850 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1f860 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1f870 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
1f880 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
1f890 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
1f8a0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1f8b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1f8c0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1f8d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1f8e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1f8f0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
1f900 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1f910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f920 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f930 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
1f940 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
1f950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f960 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1f970 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1f980 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1f990 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f9a0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f9b0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1f9c0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
1f9d0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
1f9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f9f0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1fa00 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1fa10 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1fa20 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1fa30 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1fa40 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
1fa50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fa60 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1fa70 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
1fa80 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1fa90 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
1faa0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
1fab0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1fac0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1fad0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
1fae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1faf0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fb00 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1fb10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1fb20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1fb30 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1fb40 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1fb50 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
1fb60 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
1fb70 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
1fb80 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1fb90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
1fba0 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1fbb0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
1fbc0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
1fbd0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
1fbe0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
1fbf0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
1fc00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1fc10 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
1fc20 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
1fc30 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
1fc40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1fc50 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
1fc60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1fc70 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
1fc80 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1fc90 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
1fca0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
1fcb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fcd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fce0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1fcf0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1fd00 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
1fd10 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
1fd20 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
1fd30 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
1fd40 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
1fd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1fd60 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20  t nPage;.       
1fd70 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
1fd80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61  e;.          nPa
1fd90 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
1fda0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1fdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fdc0 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a  *pPgno>nPage ){.
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1fde0 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
1fdf0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1fe00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1fe10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1fe20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1fe30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1fe40 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1fe50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fe60 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1fe70 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
1fe80 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
1fe90 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
1fea0 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
1feb0 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
1fec0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fed0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
1fee0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
1fef0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
1ff00 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
1ff10 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
1ff20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1ff30 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
1ff40 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
1ff50 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1ff60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
1ff70 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
1ff80 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1ff90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1ffa0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
1ffb0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
1ffc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ffd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ffe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1fff0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
20000 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29  llback((*ppPage)
20010 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20020 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20030 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
20040 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
20050 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
20060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
20080 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20090 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
200a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
200b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
200c0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
200d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
200e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
200f0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
20100 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
20110 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
20120 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
20130 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
20140 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
20150 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
20160 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
20170 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
20180 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
20190 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
201a0 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
201b0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
201c0 65 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  er);.    *pPgno 
201d0 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23 69  = nPage + 1;..#i
201e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
201f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
20200 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
20210 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
20220 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20  incr-vacuum has 
20230 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68  already run with
20240 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
20250 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20  ion. So the.    
20260 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c    ** page to all
20270 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f  ocate is not fro
20280 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65  m the physical e
20290 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  nd of the file, 
202a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  but.      ** at 
202b0 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20  pBt->nTrunc. .  
202c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50      */.      *pP
202d0 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  gno = pBt->nTrun
202e0 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  c+1;.      if( *
202f0 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
20300 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
20310 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  .        (*pPgno
20320 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )++;.      }.   
20330 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20340 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
20350 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
20360 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20   *pPgno) ){.    
20370 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
20380 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
20390 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
203a0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
203b0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
203c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
203d0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
203e0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
203f0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
20400 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
20410 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
20420 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
20430 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
20440 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
20450 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
20460 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
20470 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
20480 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
20490 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
204a0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
204b0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
204c0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
204d0 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
204e0 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
204f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
20500 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50  AGE(pBt) ){ (*pP
20510 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  gno)++; }.    }.
20520 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
20530 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74  unc ){.      pBt
20540 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e  ->nTrunc = *pPgn
20550 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  o;.    }.#endif.
20560 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
20570 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
20580 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
20590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
205a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
205b0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
205c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
205d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
205e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
205f0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
20600 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
20610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20620 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
20630 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
20640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
20650 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
20660 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
20670 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
20680 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
20690 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
206a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
206b0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
206c0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
206d0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
206e0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
206f0 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
20700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20710 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
20720 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53  >isInit==PAGE_IS
20730 49 4e 49 54 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  INIT_FULL ){.   
20740 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20750 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  ppPage);.      r
20760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20770 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
20780 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
20790 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
207a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
207b0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65  /*.** Add a page
207c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
207d0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65   file to the fre
207e0 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c  elist..**.** sql
207f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
20800 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66   is NOT called f
20810 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
20820 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
20830 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
20840 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
20850 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
20860 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20870 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
20880 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b  .  int rc, n, k;
20890 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
208a0 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65  he page for free
208b0 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ing */.  assert(
208c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
208d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
208e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
208f0 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
20900 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  1 );.  pPage->is
20910 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Init = 0;.  rele
20920 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70  asePage(pPage->p
20930 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65  Parent);.  pPage
20940 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a  ->pParent = 0;..
20950 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
20960 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
20970 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
20980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20990 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
209a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
209b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
209c0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
209d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
209e0 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
209f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20a00 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
20a10 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
20a20 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
20a30 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
20a40 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
20a50 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
20a60 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
20a70 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
20a80 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
20a90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
20aa0 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
20ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20ac0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
20ad0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
20ae0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20af0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
20b00 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
20b10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
20b20 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
20b30 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
20b40 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
20b50 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
20b60 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
20b70 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
20b80 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
20b90 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
20ba0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
20bb0 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
20bc0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
20bd0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  Page->pgno, PTRM
20be0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
20bf0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20c00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
20c10 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
20c20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
20c30 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a  irst free page *
20c40 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
20c50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
20c60 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
20c70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20c80 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74  n rc;.    memset
20c90 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
20ca0 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 8);.    put4by
20cb0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20cc0 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
20cd0 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28  no);.    TRACE((
20ce0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66  "FREE-PAGE: %d f
20cf0 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  irst\n", pPage->
20d00 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
20d10 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72  .    /* Other fr
20d20 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  ee pages already
20d30 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65   exist.  Retrive
20d40 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
20d50 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20   page.    ** of 
20d60 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
20d70 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61   find out how ma
20d80 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73  ny leaves it has
20d90 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
20da0 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63   *pTrunk;.    rc
20db0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
20dc0 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  etPage(pBt, get4
20dd0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20de0 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e  ata[32]), &pTrun
20df0 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
20e00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20e10 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
20e20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
20e30 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  ]);.    if( k>=p
20e40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
20e50 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
20e60 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75   The trunk is fu
20e70 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61  ll.  Turn the pa
20e80 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 69  ge being freed i
20e90 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20  nto a new.      
20ea0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69  ** trunk page wi
20eb0 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20  th no leaves..  
20ec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20ed0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
20ee0 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
20ef0 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
20f00 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
20f10 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
20f20 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
20f30 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
20f40 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
20f50 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
20f60 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
20f70 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
20f80 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
20f90 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
20fa0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
20fb0 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
20fc0 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
20fd0 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
20fe0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
20ff0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
21000 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
21010 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
21020 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
21030 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
21040 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
21050 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
21060 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
21070 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
21080 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
21090 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
210a0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
210b0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
210c0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
210d0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
210e0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
210f0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
21100 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
21110 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
21120 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
21130 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
21140 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
21150 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
21160 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
21170 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
21180 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
21190 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
211a0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
211b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
211c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
211d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
211e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
211f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
21200 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
21210 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  ta, pTrunk->pgno
21220 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
21230 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
21240 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  a[4], 0);.      
21250 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
21260 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
21270 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
21280 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
21290 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
212a0 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
212b0 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ing %d\n",.     
212c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
212d0 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e  ->pgno, pTrunk->
212e0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pgno));.      }.
212f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c      }else if( k<
21300 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
21320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21330 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c   /* Add the newl
21340 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20  y freed page as 
21350 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75  a leaf on the cu
21360 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20  rrent trunk */. 
21370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21380 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
21390 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
213a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
213b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
213c0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
213d0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31  k->aData[4], k+1
213e0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
213f0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
21400 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
21410 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
21420 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
21430 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 72 63  ELETE.        rc
21440 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 44   = sqlite3PagerD
21450 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
21460 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  pDbPage);.#endif
21470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
21480 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
21490 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
214a0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
214b0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
214c0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
214d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
214e0 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72  pTrunk);.  }.  r
214f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21500 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
21510 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
21520 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
21530 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74  iven Cell..*/.st
21540 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
21550 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
21560 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
21570 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68   *pCell){.  BtSh
21580 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
21590 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
215a0 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
215b0 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
215c0 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
215d0 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53  .  int ovflPageS
215e0 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
215f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21600 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21610 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
21620 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
21630 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
21640 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
21650 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
21660 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21670 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
21680 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
21690 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
216a0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
216b0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
216c0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
216d0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
216e0 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65  ow]);.  ovflPage
216f0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
21700 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
21710 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
21720 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
21730 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
21740 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
21750 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
21760 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
21770 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
21780 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
21790 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b   MemPage *pOvfl;
217a0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
217b0 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  o==0 || ovflPgno
217c0 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
217d0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
217e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
217f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21800 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
21810 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
21820 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
21830 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d   &pOvfl, (nOvfl=
21840 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29  =0)?0:&ovflPgno)
21850 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
21860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
21870 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66   = freePage(pOvf
21880 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  l);.    sqlite3P
21890 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
218a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
218b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
218c0 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
218d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
218e0 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
218f0 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
21900 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
21910 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
21920 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
21930 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
21940 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
21950 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
21960 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
21970 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
21980 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
21990 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
219a0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
219b0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
219c0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
219d0 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
219e0 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
219f0 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
21a00 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
21a10 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
21a20 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
21a30 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
21a40 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
21a50 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
21a60 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
21a70 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
21a80 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
21a90 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
21aa0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
21ab0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
21ac0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
21ad0 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
21ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
21af0 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
21b00 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
21b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21b20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
21b30 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
21b40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21b50 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
21b60 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
21b70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
21b80 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
21b90 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
21ba0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
21bb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
21bc0 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
21bd0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
21be0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
21c10 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
21c20 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
21c30 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
21c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
21c50 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
21c60 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
21c70 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
21c80 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
21c90 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
21ca0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
21cb0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
21cc0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
21cd0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
21ce0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21cf0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
21d00 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
21d10 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
21d20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
21d30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
21d40 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
21d50 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
21d60 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
21d70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21d80 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21d90 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
21da0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
21db0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
21dc0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
21dd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
21de0 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
21df0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
21e00 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
21e10 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
21e20 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
21e30 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
21e40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21e50 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
21e60 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
21e70 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
21e80 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
21e90 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
21ea0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21eb0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
21ec0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
21ed0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
21ee0 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
21ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21f00 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
21f10 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
21f20 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f  ata==nData+nZero
21f30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
21f40 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
21f50 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
21f60 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
21f70 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
21f80 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
21f90 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
21fa0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
21fb0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
21fc0 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
21fd0 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
21fe0 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
21ff0 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
22000 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
22010 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
22020 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
22030 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
22040 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
22050 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
22060 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
22070 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
22080 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
22090 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
220a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78  {.      int isEx
220b0 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  act = 0;.#ifndef
220c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
220d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
220e0 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
220f0 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
22100 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
22110 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
22120 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
22130 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22140 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
22150 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
22160 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
22170 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
22180 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
22190 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
221a0 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
221b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
221c0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
221d0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66       if( pgnoOvf
221e0 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>1 ){.         
221f0 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b   /* isExact = 1;
22200 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
22210 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22220 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
22230 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
22240 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
22250 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78  , pgnoOvfl, isEx
22260 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  act);.#ifndef SQ
22270 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22280 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
22290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
222a0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
222b0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
222c0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
222d0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
222e0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
222f0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
22300 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
22310 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
22320 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
22330 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
22340 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
22350 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
22360 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
22370 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
22380 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
22390 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
223a0 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
223b0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
223c0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
223d0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
223e0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
223f0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
22400 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
22410 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
22420 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
22430 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
22440 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
22450 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
22460 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
22470 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
22480 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
22490 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
224a0 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
224b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
224c0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
224d0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
224e0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
224f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
22500 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
22510 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
22520 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
22530 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
22540 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22550 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
22560 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
22570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
22580 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
22590 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
225a0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
225b0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
225c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
225d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
225e0 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
225f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22600 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
22610 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
22620 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
22630 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
22640 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
22650 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
22660 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
22670 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
22680 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
22690 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
226a0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
226b0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
226c0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
226d0 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
226e0 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
226f0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
22700 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
22710 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
22720 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
22730 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
22740 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
22750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22760 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
22770 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
22780 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
22790 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
227a0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
227b0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
227c0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
227d0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
227e0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
227f0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
22800 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
22810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
22820 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
22830 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
22840 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
22850 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d  .** Change the M
22860 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70  emPage.pParent p
22870 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61  ointer on the pa
22880 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20  ge whose number 
22890 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74  is.** given in t
228a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
228b0 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61  nt so that MemPa
228c0 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  ge.pParent holds
228d0 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20   the.** pointer 
228e0 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67  in the third arg
228f0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
22900 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75 6d 65  the final argume
22910 6e 74 2c 20 75 70 64 61 74 65 50 74 72 6d 61 70  nt, updatePtrmap
22920 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  , is non-zero an
22930 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  d the database.*
22940 2a 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  * is an auto-vac
22950 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
22960 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
22970 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 67 6e  ap entry for pgn
22980 6f 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 2e  o.** is updated.
22990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
229a0 65 70 61 72 65 6e 74 50 61 67 65 28 0a 20 20 42  eparentPage(.  B
229b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
229d0 42 2d 54 72 65 65 20 73 74 72 75 63 74 75 72 65  B-Tree structure
229e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
22a10 65 72 20 6f 66 20 63 68 69 6c 64 20 62 65 69 6e  er of child bein
22a20 67 20 61 64 6f 70 74 65 64 20 2a 2f 0a 20 20 4d  g adopted */.  M
22a30 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65  emPage *pNewPare
22a40 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
22a50 4e 65 77 20 70 61 72 65 6e 74 20 6f 66 20 70 67  New parent of pg
22a60 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  no */.  int idx,
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a80 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
22a90 66 20 63 68 69 6c 64 20 70 61 67 65 20 70 67 6e  f child page pgn
22aa0 6f 20 69 6e 20 70 4e 65 77 50 61 72 65 6e 74 20  o in pNewParent 
22ab0 2a 2f 0a 20 20 69 6e 74 20 75 70 64 61 74 65 50  */.  int updateP
22ac0 74 72 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  trmap           
22ad0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 75     /* If true, u
22ae0 70 64 61 74 65 20 70 6f 69 6e 74 65 72 2d 6d 61  pdate pointer-ma
22af0 70 20 66 6f 72 20 70 67 6e 6f 20 2a 2f 0a 29 7b  p for pgno */.){
22b00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69  .  MemPage *pThi
22b10 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  s;.  DbPage *pDb
22b20 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
22b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22b40 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
22b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  );.  assert( pNe
22b60 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20  wParent!=0 );.  
22b70 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
22b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22b90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
22ba0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44  Pager!=0 );.  pD
22bb0 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
22bc0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
22bd0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
22be0 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
22bf0 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d      pThis = (Mem
22c00 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
22c10 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
22c20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  age);.    if( pT
22c30 68 69 73 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47  his->isInit==PAG
22c40 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 7b  E_ISINIT_FULL ){
22c50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22c60 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  This->aData==sql
22c70 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
22c80 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  (pDbPage) );.   
22c90 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
22ca0 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
22cb0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
22cc0 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
22cd0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
22ce0 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
22cf0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
22d00 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
22d10 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
22d20 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
22d30 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
22d40 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
22d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
22d60 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
22d70 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
22d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22d90 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
22da0 0a 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  ..  if( ISAUTOVA
22db0 43 55 55 4d 20 26 26 20 75 70 64 61 74 65 50 74  CUUM && updatePt
22dc0 72 6d 61 70 20 29 7b 0a 20 20 20 20 72 65 74 75  rmap ){.    retu
22dd0 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74  rn ptrmapPut(pBt
22de0 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
22df0 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74  TREE, pNewParent
22e00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 23 69  ->pgno);.  }..#i
22e10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
22e20 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65 50  * If the updateP
22e30 74 72 6d 61 70 20 66 6c 61 67 20 77 61 73 20 63  trmap flag was c
22e40 6c 65 61 72 2c 20 61 73 73 65 72 74 20 74 68 61  lear, assert tha
22e50 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74  t the entry in t
22e60 68 65 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 2d  he.  ** pointer-
22e70 6d 61 70 20 69 73 20 61 6c 72 65 61 64 79 20 63  map is already c
22e80 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  orrect..  */.  i
22e90 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
22ea0 29 7b 0a 20 20 20 20 70 44 62 50 61 67 65 20 3d  ){.    pDbPage =
22eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
22ec0 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
22ed0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
22ee0 74 2c 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66  t,pgno));.    if
22ef0 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
22f00 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
22f10 20 20 20 50 67 6e 6f 20 69 69 3b 0a 20 20 20 20     Pgno ii;.    
22f20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61    int rc = ptrma
22f30 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20  pGet(pBt, pgno, 
22f40 26 65 54 79 70 65 2c 20 26 69 69 29 3b 0a 20 20  &eType, &ii);.  
22f50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
22f60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3d  SQLITE_OK && ii=
22f70 3d 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e  =pNewParent->pgn
22f80 6f 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  o && eType==PTRM
22f90 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
22fa0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22fb0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
22fc0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
22fd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22fe0 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
22ff0 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
23000 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
23010 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
23020 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
23030 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
23040 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
23050 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
23060 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
23070 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
23080 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
23090 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
230a0 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
230b0 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
230c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
230d0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
230e0 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
230f0 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
23100 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
23110 2a 2a 0a 2a 2a 20 49 66 20 75 70 64 61 74 65 50  **.** If updateP
23120 74 72 6d 61 70 20 69 73 20 74 72 75 65 2c 20 74  trmap is true, t
23130 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
23140 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
23150 61 6c 6c 20 63 68 69 6c 64 0a 2a 2a 20 70 61 67  all child.** pag
23160 65 73 20 6f 66 20 70 50 61 67 65 20 61 72 65 20  es of pPage are 
23170 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  updated..*/.stat
23180 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
23190 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
231a0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 75 70  e *pPage, int up
231b0 64 61 74 65 50 74 72 6d 61 70 29 7b 0a 20 20 69  datePtrmap){.  i
231c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
231d0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  K;.  assert( sql
231e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
231f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
23200 78 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  x) );.  if( !pPa
23210 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
23220 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
23230 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
23240 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
23250 69 52 69 67 68 74 20 3d 20 67 65 74 34 62 79 74  iRight = get4byt
23260 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
23270 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23280 2b 38 5d 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  +8]);..    for(i
23290 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
232a0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
232b0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
232c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
232d0 20 20 20 20 20 20 72 63 20 3d 20 72 65 70 61 72        rc = repar
232e0 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
232f0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
23300 61 67 65 2c 20 69 2c 20 75 70 64 61 74 65 50 74  age, i, updatePt
23310 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28  rmap);.      if(
23320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23340 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  }.    rc = repar
23350 65 6e 74 50 61 67 65 28 70 42 74 2c 20 69 52 69  entPage(pBt, iRi
23360 67 68 74 2c 20 70 50 61 67 65 2c 20 69 2c 20 75  ght, pPage, i, u
23370 70 64 61 74 65 50 74 72 6d 61 70 29 3b 0a 20 20  pdatePtrmap);.  
23380 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
23390 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
233a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
233b0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
233c0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
233d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
233e0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
233f0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
23400 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
23410 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
23420 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
23430 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
23440 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
23450 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
23460 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
23470 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
23480 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
23490 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
234a0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
234b0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
234c0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
234d0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
234e0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
234f0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
23500 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
23510 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
23520 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
23530 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
23540 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
23550 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
23560 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
23570 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
23580 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
23590 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
235a0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
235b0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
235c0 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
235d0 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
235e0 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20  hin data[] */.. 
235f0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
23600 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
23610 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
23620 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
23630 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
23640 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
23650 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
23660 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
23670 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23680 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23690 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
236a0 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
236b0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
236c0 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
236d0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
236e0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
236f0 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
23700 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
23710 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
23720 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
23730 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
23740 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
23750 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
23760 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
23770 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
23780 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
23790 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
237a0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
237b0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
237c0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
237d0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
237e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
237f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
23800 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
23810 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
23820 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
23830 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
23840 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
23850 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
23860 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
23870 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
23880 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
23890 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
238a0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
238b0 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
238c0 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
238d0 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
238e0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
238f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
23900 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
23910 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
23920 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
23930 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
23940 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
23950 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
23960 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
23970 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
23980 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
23990 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
239a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
239b0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
239c0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
239d0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
239e0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
239f0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
23a00 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
23a10 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
23a20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
23a30 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
23a40 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
23a50 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
23a60 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
23a70 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
23a80 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
23a90 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
23aa0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
23ab0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
23ac0 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
23ad0 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
23ae0 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
23af0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
23b00 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
23b10 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
23b20 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
23b30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23b40 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
23b50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
23b60 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
23b70 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
23b80 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
23b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23ba0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
23bb0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
23bc0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
23bd0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
23be0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
23bf0 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
23c00 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
23c10 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
23c20 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
23c30 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
23c40 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
23c50 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
23c60 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
23c70 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
23c80 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
23c90 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
23ca0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
23cb0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
23cc0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
23cd0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
23ce0 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
23cf0 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
23d00 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
23d10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23d20 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
23d30 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
23d40 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
23d50 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
23d60 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
23d70 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
23d80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
23d90 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
23da0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
23db0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
23dc0 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
23dd0 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
23de0 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
23df0 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
23e00 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
23e10 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
23e20 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
23e30 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
23e40 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
23e50 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
23e60 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
23e70 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
23e80 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
23e90 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
23ea0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
23eb0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
23ec0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
23ed0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
23ee0 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
23ef0 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
23f00 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
23f10 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
23f20 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
23f30 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
23f40 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
23f50 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
23f60 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
23f70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23f80 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
23f90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
23fa0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
23fb0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
23fc0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
23fd0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
23fe0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
23ff0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
24000 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
24010 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
24020 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
24030 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
24040 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
24050 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67  t( j<sizeof(pPag
24060 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
24070 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
24080 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
24090 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
240a0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
240b0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
240c0 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = i;.    pPage->
240d0 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nFree = 0;.  }el
240e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
240f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24100 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
24110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
24120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24140 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24150 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24160 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
24170 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
24180 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
24190 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50  ta;.    hdr = pP
241a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
241b0 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
241c0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
241d0 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
241e0 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
241f0 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
24200 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
24210 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b  Page->nCell + 2;
24220 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
24230 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
24240 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d   if( end > top -
24250 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 64 65 66   sz ){.      def
24260 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
24270 65 29 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  e);.      top = 
24280 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
24290 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
242a0 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
242b0 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
242c0 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
242d0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
242e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
242f0 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
24300 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
24310 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
24320 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
24330 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
24340 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
24350 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
24360 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
24370 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
24380 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
24390 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
243a0 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
243b0 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
243c0 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
243d0 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
243e0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
243f0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
24400 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
24410 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
24420 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
24430 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
24440 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
24450 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24460 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
24470 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
24480 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
24490 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
244a0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
244b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
244c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
244d0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
244e0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
244f0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
24500 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
24510 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
24520 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
24530 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
24540 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
24550 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
24560 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
24570 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
24580 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
24590 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
245a0 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
245b0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66  load );.      if
245c0 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
245d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
245e0 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
245f0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
24600 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
24610 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
24620 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
24630 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
24640 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
24650 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ->pBt, pgnoOvfl,
24660 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
24670 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
24680 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
24690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
246a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
246b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
246c0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
246d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
246e0 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
246f0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
24700 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
24710 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
24720 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
24730 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
24740 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
24750 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
24760 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
24770 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24780 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
24790 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
247a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
247b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
247c0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
247d0 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
247e0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
247f0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
24800 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
24810 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
24820 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
24830 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
24840 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
24850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24860 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
24870 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20   int totalSize; 
24880 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
24890 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
248a0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
248b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
248c0 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
248d0 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20    int cellptr;  
248e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
248f0 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
24900 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
24910 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
24920 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
24930 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
24940 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
24950 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70  * Data for the p
24960 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
24970 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
24980 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
24990 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
249a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
249b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f  ->mutex) );.  to
249c0 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66  talSize = 0;.  f
249d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
249e0 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c   i++){.    total
249f0 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  Size += aSize[i]
24a00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24a10 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c  totalSize+2*nCel
24a20 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  l<=pPage->nFree 
24a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24a40 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
24a50 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
24a60 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
24a70 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
24a80 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
24a90 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
24aa0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
24ab0 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
24ac0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
24ad0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
24ae0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
24af0 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
24b00 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
24b10 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
24b20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
24b30 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
24b40 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
24b50 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
24b60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
24b70 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
24b80 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
24b90 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
24ba0 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
24bb0 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
24bc0 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
24bd0 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
24be0 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
24bf0 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
24c00 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
24c10 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
24c20 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
24c30 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
24c40 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
24c50 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a   = nCell;.}../*.
24c60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24c70 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
24c80 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
24c90 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
24ca0 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
24cb0 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
24cc0 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
24cd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
24ce0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
24cf0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
24d00 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
24d10 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
24d20 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
24d30 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
24d40 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
24d50 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
24d60 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
24d70 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
24d80 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
24d90 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
24da0 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
24db0 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
24dc0 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
24dd0 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
24de0 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
24df0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
24e00 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
24e10 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
24e20 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
24e30 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
24e40 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
24e50 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
24e60 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
24e70 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
24e80 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
24e90 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
24ea0 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
24eb0 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
24ec0 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
24ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24ee0 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
24ef0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
24f00 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
24f10 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
24f20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
24f30 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
24f40 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
24f50 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
24f60 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
24f70 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
24f80 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  age*, int);..#if
24f90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24fa0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
24fb0 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
24fc0 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
24fd0 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
24fe0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
24ff0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
25000 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
25010 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
25020 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
25030 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
25040 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
25050 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
25060 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
25070 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
25080 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
25090 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
250a0 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
250b0 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
250c0 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
250d0 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
250e0 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
250f0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
25100 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
25110 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
25120 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
25130 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
25140 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
25150 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
25160 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
25170 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
25180 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
25190 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
251a0 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
251b0 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
251c0 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
251d0 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
251e0 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
251f0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
25200 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
25210 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
25220 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
25230 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
25240 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
25250 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
25260 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
25270 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
25280 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
25290 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
252a0 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
252b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
252c0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
252d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d  emPage *pPage, M
252e0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29  emPage *pParent)
252f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
25300 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b  mPage *pNew = 0;
25310 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
25320 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
25330 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  u16 szCell;.  Ce
25340 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42  llInfo info;.  B
25350 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25360 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
25370 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
25380 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
25390 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
253a0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
253b0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
253c0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
253d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
253e0 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
253f0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
25400 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
25410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
25420 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
25430 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
25440 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25450 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
25460 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
25470 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
25480 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
25490 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
254a0 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
254b0 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
254c0 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
254d0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
254e0 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
254f0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
25500 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
25510 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
25520 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
25530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25540 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   pCell = pPage->
25550 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
25560 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c      szCell = cel
25570 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
25580 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7a 65 72 6f  pCell);.    zero
25590 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
255a0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
255b0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
255c0 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
255d0 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  szCell);.    pPa
255e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
255f0 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74  0;.  .    /* Set
25600 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
25610 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
25620 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65  ed page to pPare
25630 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  nt. */.    pNew-
25640 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
25650 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
25660 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
25670 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 0a 20 20  >pDbPage);.  .  
25680 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75    /* pPage is cu
25690 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68  rrently the righ
256a0 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t-child of pPare
256b0 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a  nt. Change this.
256c0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
256d0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69  he right-child i
256e0 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  s the new page a
256f0 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61  llocated above a
25700 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65 20  nd.    ** pPage 
25710 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72  is the next-to-r
25720 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 20  ight child. .   
25730 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f 72   **.    ** Ignor
25740 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
25750 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74  ue of the call t
25760 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20  o fillInCell(). 
25770 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 20  fillInCell().   
25780 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74   ** may only ret
25790 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53  urn other than S
257a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69  QLITE_OK if it i
257b0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  s required to al
257c0 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f 6e  locate.    ** on
257d0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
257e0 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65 20  ow pages. Since 
257f0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c  an internal tabl
25800 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20  e B-Tree cell . 
25810 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20     ** may never 
25820 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20  spill over onto 
25830 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25840 20 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d 75   (it is a maximu
25850 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33 20  m of .    ** 13 
25860 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20  bytes in size), 
25870 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73  it is not necces
25880 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68  sary to check th
25890 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20  e return code.. 
258a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d     **.    ** Sim
258b0 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65  ilarly, the inse
258c0 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f  rtCell() functio
258d0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66  n cannot fail if
258e0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
258f0 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
25900 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79 20  into is already 
25910 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68 65  writable and the
25920 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 0a   cell does not .
25930 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61      ** contain a
25940 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74  n overflow point
25950 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  er. So ignore th
25960 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  is return code t
25970 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  oo..    */.    a
25980 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
25990 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43 65  ell>0 );.    pCe
259a0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
259b0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
259c0 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l-1);.    sqlite
259d0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
259e0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
259f0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69 6c   &info);.    fil
25a00 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
25a10 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
25a20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
25a30 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29   0, &parentSize)
25a40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
25a50 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
25a60 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
25a70 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
25a80 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
25a90 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73 65  age) );.    inse
25aa0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
25ab0 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e  parentIdx, paren
25ac0 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a  tCell, parentSiz
25ad0 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 75  e, 0, 4);.    pu
25ae0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
25af0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
25b00 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
25b10 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75  e->pgno);.    pu
25b20 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
25b30 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
25b40 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
25b50 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
25b60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
25b70 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
25b80 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
25b90 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
25ba0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
25bb0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
25bc0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
25bd0 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
25be0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
25bf0 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
25c00 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  low page..    */
25c10 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
25c20 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
25c30 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
25c40 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
25c50 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
25c60 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
25c70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25c80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
25c90 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
25ca0 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20  pNew, 0);.      
25cb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
25cc0 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
25cd0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
25ce0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
25cf0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
25d00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
25d10 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50 61  is point the pPa
25d20 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61 62  ge->nFree variab
25d30 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63 6f  le is not set co
25d40 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20 2a  rrectly with.  *
25d50 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74 68 65  * respect to the
25d60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25d70 70 61 67 65 20 28 62 65 63 61 75 73 65 20 69 74  page (because it
25d80 20 77 61 73 20 73 65 74 20 74 6f 20 30 20 62 79   was set to 0 by
25d90 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c   .  ** insertCel
25da0 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c 69  l). So call sqli
25db0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
25dc0 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  () to make sure 
25dd0 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72 65  it is.  ** corre
25de0 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ct..  **.  ** Th
25df0 69 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e  is has to be don
25e00 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  e even if an err
25e10 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
25e20 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  ned. Normally, i
25e30 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
25e40 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 72  occurs during tr
25e50 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  ee balancing, th
25e60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65  e contents of Me
25e70 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20 6e  mPage are.  ** n
25e80 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73  ot important, as
25e90 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
25ea0 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e 20  calculated when 
25eb0 74 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  the page is roll
25ec0 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42 75  ed.  ** back. Bu
25ed0 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61 6e  t here, in balan
25ee0 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20 69  ce_quick(), it i
25ef0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
25f00 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a 20  pPage has .  ** 
25f10 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61 72  not yet been mar
25f20 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77 72 69  ked dirty or wri
25f30 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
25f40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
25f50 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77 69  efore.  ** it wi
25f60 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  ll not be rolled
25f70 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74 20   back and so it 
25f80 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
25f90 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
25fa0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61 74   ** the page dat
25fb0 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20 6f  a and contents o
25fc0 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63 6f  f MemPage are co
25fd0 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  nsistent..  */. 
25fe0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
25ff0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
26000 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
26010 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
26020 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
26030 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 50  rUnref(pPage->pP
26040 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
26050 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74  ..  /* If everyt
26060 68 69 6e 67 20 65 6c 73 65 20 73 75 63 63 65 65  hing else succee
26070 64 65 64 2c 20 62 61 6c 61 6e 63 65 20 74 68 65  ded, balance the
26080 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 69 6e   parent page, in
26090 20 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20   .  ** case the 
260a0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73  divider cell ins
260b0 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20  erted caused it 
260c0 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  to become overfu
260d0 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ll..  */.  if( r
260e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
260f0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
26100 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
26110 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26120 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
26130 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
26140 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
26150 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
26160 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
26170 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
26180 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
26190 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
261a0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
261b0 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
261c0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
261d0 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
261e0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
261f0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
26200 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
26210 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
26220 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
26230 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
26240 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
26250 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
26260 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
26270 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
26280 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
26290 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
262a0 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
262b0 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
262c0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
262d0 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
262e0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
262f0 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
26300 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
26310 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
26320 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
26330 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
26340 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
26350 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
26360 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
26370 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
26380 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
26390 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
263a0 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
263b0 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
263c0 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
263d0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
263e0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
263f0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
26400 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
26410 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
26420 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
26430 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
26440 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
26450 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
26460 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
26470 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
26480 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
26490 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
264a0 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
264b0 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
264c0 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
264d0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
264e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
264f0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
26500 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
26510 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
26520 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
26530 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
26540 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
26550 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
26560 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
26570 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
26580 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26590 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
265a0 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
265b0 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
265c0 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
265d0 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
265e0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
265f0 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
26600 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
26610 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
26620 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
26630 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
26640 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
26650 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
26660 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26670 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
26680 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
26690 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
266a0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
266b0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
266c0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
266d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
266e0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
266f0 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
26700 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
26710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
26720 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
26730 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
26740 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
26750 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  nroot(MemPage *p
26760 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
26770 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
26780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
26790 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ent of pPage */.
267a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
267c0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
267d0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
267e0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
267f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26800 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
26810 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
26820 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
26830 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
26840 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
26850 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
26860 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  om. */.  int nOl
26870 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
26880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26890 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
268a0 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
268b0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
268c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
268d0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
268e0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
268f0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26900 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26910 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
26920 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
26930 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
26940 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
26950 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
26960 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
26970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26980 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
26990 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
269a0 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
269b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269c0 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
269d0 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
269e0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
269f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
26a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26a10 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
26a20 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
26a30 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
26a40 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
26a50 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
26a60 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
26a70 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
26a80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
26a90 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
26aa0 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
26ab0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
26ac0 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
26ad0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
26ae0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
26af0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
26b00 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
26b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
26b20 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
26b30 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
26b40 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
26b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
26b60 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
26b70 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
26b80 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
26b90 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
26ba0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
26bb0 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
26bc0 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
26bd0 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20   iSpace2 = 0;   
26be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
26bf0 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
26c00 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20  f aSpace2[] */. 
26c10 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20   int szScratch; 
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c30 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68   Size of scratch
26c40 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65   memory requeste
26c50 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
26c60 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
26c70 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
26c80 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
26c90 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
26ca0 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
26cb0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
26cc0 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
26cd0 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
26ce0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
26cf0 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
26d00 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
26d10 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
26d20 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
26d30 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
26d40 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
26d50 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
26d60 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
26d70 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
26d80 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
26d90 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
26da0 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
26db0 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
26dc0 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
26dd0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
26de0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
26df0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
26e00 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
26e10 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
26e20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
26e30 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
26e40 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
26e50 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
26e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26e70 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
26e80 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
26e90 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
26ea0 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ec0 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
26ed0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
26ee0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
26ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
26f00 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
26f10 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
26f20 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
26f30 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
26f40 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69   Space for holdi
26f50 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70  ng data of apCop
26f60 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  y[] */.  u8 *aSp
26f70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
26f80 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70  /* Space for cop
26f90 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
26fa0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c  cells before bal
26fb0 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ance */.  u8 *aS
26fc0 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20  pace2 = 0;      
26fd0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76   /* Space for ov
26fe0 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20  erflow dividers 
26ff0 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61  cells after bala
27000 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72  nce */.  u8 *aFr
27010 6f 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  om = 0;..  asser
27020 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27030 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
27040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
27050 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  * .  ** Find the
27060 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
27070 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
27080 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45  ge->isInit==PAGE
27090 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 3b 0a  _ISINIT_FULL );.
270a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
270b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
270c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
270d0 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ) || pPage->nOve
270e0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42  rflow==1 );.  pB
270f0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
27100 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67    pParent = pPag
27110 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73  e->pParent;.  as
27120 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b  sert( pParent );
27130 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
27140 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
27150 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e  agerWrite(pParen
27160 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  t->pDbPage)) ){.
27170 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27180 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41   }..  TRACE(("BA
27190 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
271a0 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
271b0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
271c0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
271d0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
271e0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
271f0 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ANCE.  /*.  ** A
27200 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   special case:  
27210 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68  If a new entry h
27220 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
27230 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a  erted into a.  *
27240 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73  * table (that is
27250 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69  , a btree with i
27260 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20  nteger keys and 
27270 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20  all data at the 
27280 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64  leaves).  ** and
27290 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
272a0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
272b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
272c0 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20  ee (it has the. 
272d0 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29   ** largest key)
272e0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70   then use the sp
272f0 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75  ecial balance_qu
27300 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ick() routine fo
27310 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  r.  ** balancing
27320 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  .  balance_quick
27330 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65  () is much faste
27340 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e  r and results in
27350 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20   a tighter.  ** 
27360 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20  packing of data 
27370 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
27380 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
27390 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20  Page->leaf &&.  
273a0 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
273b0 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  y &&.      pPage
273c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26  ->nOverflow==1 &
273d0 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61  &.      pPage->a
273e0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
273f0 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20  ge->nCell &&.   
27400 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
27410 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20  t->pgno!=1 &&.  
27420 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
27430 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
27440 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
27450 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  8])==pPage->pgno
27460 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
27470 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
27480 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  );.    /*.    **
27490 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
274a0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65   siblings to the
274b0 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20   left of pPage. 
274c0 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20  It may be that. 
274d0 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e     ** they are n
274e0 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e  ot full and no n
274f0 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69  ew page is requi
27500 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
27510 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71  return balance_q
27520 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72  uick(pPage, pPar
27530 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ent);.  }.#endif
27540 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
27550 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
27560 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
27570 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20  ->pDbPage)) ){. 
27580 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
27590 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
275a0 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  d the cell in th
275b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68  e parent page wh
275c0 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70  ose left child p
275d0 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20  oints back.  ** 
275e0 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22  to pPage.  The "
275f0 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73  idx" variable is
27600 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
27610 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61  at cell.  If pPa
27620 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72  ge.  ** is the r
27630 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ightmost child o
27640 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73  f pParent then s
27650 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e  et idx to pParen
27660 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20  t->nCell .  */. 
27670 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64   if( pParent->id
27680 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67  xShift ){.    Pg
27690 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e  no pgno;.    pgn
276a0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
276b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
276c0 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
276d0 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
276e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
276f0 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c   for(idx=0; idx<
27700 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
27710 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  idx++){.      if
27720 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
27730 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78  ell(pParent, idx
27740 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ))==pgno ){.    
27750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27760 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
27770 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74  ert( idx<pParent
27780 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
27790 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65       || get4byte
277a0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
277b0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
277c0 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b  set+8])==pgno );
277d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
277e0 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  x = pPage->idxPa
277f0 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rent;.  }..  /*.
27800 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
27810 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61  variables so tha
27820 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66  t it will be saf
27830 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64  e to jump.  ** d
27840 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e  irectly to balan
27850 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e  ce_cleanup at an
27860 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  y moment..  */. 
27870 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30   nOld = nNew = 0
27880 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
27890 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
278a0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Page);..  /*.  *
278b0 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
278c0 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
278d0 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
278e0 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
278f0 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
27900 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
27910 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
27920 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
27930 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
27940 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
27950 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
27960 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
27970 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
27980 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
27990 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
279a0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
279b0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
279c0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
279d0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
279e0 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
279f0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
27a00 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
27a10 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
27a20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
27a30 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
27a40 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
27a50 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
27a60 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
27a70 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
27a80 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
27a90 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
27aa0 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
27ab0 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
27ac0 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
27ad0 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
27ae0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
27af0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
27b00 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
27b10 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
27b20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27b30 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
27b40 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
27b50 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
27b60 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
27b70 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
27b80 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
27b90 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
27ba0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
27bb0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
27bc0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
27bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
27be0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
27bf0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
27c00 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
27c10 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50  ], &apOld[i], pP
27c20 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  arent);.    if( 
27c30 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
27c40 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
27c50 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65  pOld[i]->idxPare
27c60 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f  nt = k;.    apCo
27c70 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
27c80 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
27c90 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
27ca0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
27cb0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
27cc0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
27cd0 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
27ce0 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
27cf0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
27d00 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
27d10 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
27d20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
27d30 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
27d40 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
27d50 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
27d60 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
27d70 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
27d80 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20   */.  szScratch 
27d90 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
27da0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
27dd0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
27de0 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
27e10 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
27e20 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
27e30 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
27e40 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
27e50 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
27e60 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
27e90 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f  /.     + (ISAUTO
27ea0 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c  VACUUM ? nMaxCel
27eb0 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20  ls : 0);        
27ec0 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f       /* aFrom */
27ed0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
27ee0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
27ef0 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
27f00 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
27f10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
27f20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
27f30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
27f40 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
27f50 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
27f60 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
27f70 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
27f80 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
27f90 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
27fa0 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61  Copy[0] - (u8*)a
27fb0 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
27fc0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
27fd0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
27fe0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
27ff0 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
28000 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
28010 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
28020 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
28030 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
28040 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
28050 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  i] - (u8*)apCell
28060 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
28070 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
28080 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
28090 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
280a0 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
280b0 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
280c0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
280d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
280e0 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70 43  pace1 - (u8*)apC
280f0 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
28100 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
28110 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
28120 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
28130 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  UM ){.    aFrom 
28140 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  = &aSpace1[pBt->
28150 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20  pageSize];.  }. 
28160 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74   aSpace2 = sqlit
28170 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74  e3PageMalloc(pBt
28180 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
28190 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b  f( aSpace2==0 ){
281a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
281b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
281c0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
281d0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
281e0 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
281f0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
28200 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
28210 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
28220 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
28230 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
28240 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
28250 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
28260 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
28270 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
28280 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
28290 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
282a0 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
282b0 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
282c0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
282d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
282e0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
282f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
28300 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
28310 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a  Page*)aCopy[i];.
28320 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70      memcpy(p, ap
28330 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
28340 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d  emPage));.    p-
28350 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
28360 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  &p[1];.    memcp
28370 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  y(p->aData, apOl
28380 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
28390 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
283a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
283b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
283c0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
283d0 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
283e0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
283f0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
28400 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
28410 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
28420 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
28430 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
28440 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
28450 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
28460 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
28470 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
28480 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
28490 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
284a0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
284b0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
284c0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
284d0 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
284e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
284f0 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
28500 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
28510 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
28520 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
28530 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
28540 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
28550 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
28560 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
28570 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
28580 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
28590 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
285a0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
285b0 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
285c0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
285d0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
285e0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
285f0 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
28600 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
28610 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
28620 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
28630 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
28640 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
28650 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
28660 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
28670 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
28680 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
28690 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
286a0 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
286b0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
286c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
286d0 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
286e0 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  ge->hasData;.  f
286f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
28700 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
28710 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
28720 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
28730 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
28740 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
28750 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
28760 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
28770 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
28780 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
28790 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
287a0 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
287b0 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
287c0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
287d0 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
287e0 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
287f0 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66  Cell]);.      if
28800 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
28810 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
28820 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
28830 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20  Cell] = i;.     
28840 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
28850 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
28860 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
28870 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
28880 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
28890 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
288a0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
288b0 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
288c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
288d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
288e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
288f0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
28900 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
28910 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  1 ){.      u16 s
28920 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
28930 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
28940 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
28950 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
28960 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
28970 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
28980 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
28990 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
289a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
289b0 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
289c0 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
289d0 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
289e0 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
289f0 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
28a00 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
28a10 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
28a20 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
28a30 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
28a40 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
28a50 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
28a60 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
28a70 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
28a80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28a90 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
28aa0 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
28ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28ac0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
28ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
28ae0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
28af0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
28b00 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
28b10 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
28b20 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
28b30 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31  .        iSpace1
28b40 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
28b50 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
28b60 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
28b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
28b80 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
28b90 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
28ba0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
28bb0 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
28bc0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
28bd0 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
28be0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
28bf0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
28c00 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
28c10 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
28c20 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
28c30 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
28c40 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
28c50 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  , sz);.        s
28c60 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
28c70 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
28c80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28c90 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d  get4byte(pTemp)=
28ca0 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20  =pgnoOld[i] );. 
28cb0 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64         if( !pOld
28cc0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28cd0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
28ce0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
28cf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
28d00 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
28d10 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
28d20 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
28d30 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
28d40 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
28d50 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
28d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
28d70 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
28d80 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
28d90 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  [pOld->hdrOffset
28da0 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  +8], 4);.       
28db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28dc0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
28dd0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
28de0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43           if( szC
28df0 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
28e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28e10 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
28e20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
28e30 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
28e40 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c             szCel
28e50 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20  l[nCell] = 4;.  
28e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28e70 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c    }.        nCel
28e80 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
28e90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
28ea0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
28eb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
28ec0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
28ed0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
28ee0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
28ef0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
28f00 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
28f10 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
28f20 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
28f30 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
28f40 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
28f50 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
28f60 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
28f70 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
28f80 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
28f90 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
28fa0 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
28fb0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
28fc0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
28fd0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
28fe0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
28ff0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
29000 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
29010 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
29020 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
29030 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
29040 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
29050 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
29060 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
29070 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
29080 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
29090 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
290a0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
290b0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
290c0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
290d0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
290e0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
290f0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
29100 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
29110 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
29120 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
29130 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
29140 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
29150 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
29160 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
29170 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
29180 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
29190 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
291a0 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
291b0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
291c0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
291d0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
291e0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
291f0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
29200 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
29210 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
29220 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
29230 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
29240 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
29250 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
29260 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
29270 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
29280 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
29290 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
292a0 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
292b0 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
292c0 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
292d0 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
292e0 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
292f0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
29300 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
29310 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
29320 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
29330 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
29340 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
29350 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
29360 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
29370 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
29380 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
29390 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
293a0 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
293b0 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
293c0 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
293d0 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
293e0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
293f0 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
29400 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
29410 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
29420 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
29430 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
29440 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
29450 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
29460 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
29470 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
29480 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
29490 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
294a0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
294b0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
294c0 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
294d0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
294e0 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
294f0 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
29500 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
29510 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
29520 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
29530 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
29540 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
29550 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
29560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29570 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
29580 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
29590 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
295a0 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
295b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
295c0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
295d0 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
295e0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
295f0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
29600 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
29610 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
29620 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
29630 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
29640 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
29650 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
29660 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
29670 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
29680 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
29690 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
296a0 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
296b0 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
296c0 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
296d0 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
296e0 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
296f0 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
29700 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
29710 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
29720 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
29730 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
29740 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
29750 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
29760 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
29770 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
29780 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
29790 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20  ew[0])>0) or we 
297a0 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76  are the.  ** a v
297b0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
297c0 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
297d0 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
297e0 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
297f0 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
29800 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
29810 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
29820 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
29830 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
29840 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
29850 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
29860 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
29870 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
29880 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
29890 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
298a0 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
298b0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
298c0 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
298d0 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20   );.  pageFlags 
298e0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  = pPage->aData[0
298f0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
29900 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
29910 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
29920 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
29930 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
29940 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
29950 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
29960 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20   = pgnoOld[i];. 
29970 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
29980 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
29990 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
299a0 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
299b0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
299c0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
299d0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
299e0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
299f0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
29a00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
29a10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
29a20 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
29a30 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77  oNew[i], pgnoNew
29a40 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [i-1], 0);.     
29a50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
29a60 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
29a70 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
29a80 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
29a90 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  w++;.    }.  }..
29aa0 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
29ab0 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
29ac0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
29ad0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
29ae0 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
29af0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
29b00 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
29b10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
29b20 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29b30 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
29b40 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
29b50 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
29b60 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
29b70 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
29b80 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
29b90 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
29ba0 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
29bb0 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
29bc0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
29bd0 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
29be0 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
29bf0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
29c00 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
29c10 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
29c20 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
29c30 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
29c40 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
29c50 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
29c60 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
29c70 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
29c80 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
29c90 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
29ca0 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
29cb0 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
29cc0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
29cd0 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
29ce0 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
29cf0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
29d00 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
29d10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
29d20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
29d30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
29d40 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
29d50 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
29d60 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
29d70 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
29d80 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
29d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
29da0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
29db0 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
29dc0 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
29dd0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
29de0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
29df0 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
29e00 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
29e10 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
29e20 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
29e30 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
29e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29e50 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
29e60 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
29e70 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
29e80 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
29e90 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
29ea0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
29eb0 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
29ec0 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
29ed0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
29ee0 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
29ef0 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
29f00 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
29f10 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
29f20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
29f30 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
29f40 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
29f50 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
29f60 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
29f70 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
29f80 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
29f90 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
29fa0 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
29fb0 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
29fc0 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
29fd0 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
29fe0 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
29ff0 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
2a000 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
2a010 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
2a020 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
2a030 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
2a040 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
2a050 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
2a060 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
2a070 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
2a080 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
2a090 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
2a0a0 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
2a0b0 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
2a0c0 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
2a0d0 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
2a0e0 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
2a0f0 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
2a100 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
2a110 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
2a120 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
2a130 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
2a140 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2a150 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
2a160 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
2a170 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2a180 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2a190 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
2a1a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2a1b0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2a1c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2a1d0 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
2a1e0 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2a1f0 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
2a200 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
2a210 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
2a220 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
2a230 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
2a240 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2a250 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
2a260 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
2a270 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
2a280 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
2a290 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
2a2a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2a2b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2a2c0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2a2d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
2a2e0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
2a2f0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
2a300 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
2a310 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
2a320 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
2a330 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
2a340 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
2a350 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
2a360 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
2a370 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
2a380 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
2a390 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
2a3a0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2a3b0 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  M ){.      for(k
2a3c0 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
2a3d0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
2a3e0 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
2a3f0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
2a400 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
2a410 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
2a420 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
2a430 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
2a440 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2a450 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
2a460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2a470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a480 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  & leafCorrection
2a490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a4a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2a4b0 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
2a4c0 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d  apCell[k]), PTRM
2a4d0 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
2a4e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
2a4f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2a500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
2a520 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a530 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
2a540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a550 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d  }.    }..    j =
2a560 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
2a570 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
2a580 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
2a590 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
2a5a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
2a5b0 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
2a5c0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
2a5d0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
2a5e0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
2a5f0 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
2a600 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
2a610 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
2a620 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
2a630 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
2a640 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2a650 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
2a660 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
2a670 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
2a680 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
2a690 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2a6a0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
2a6b0 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a  pace2[iSpace2];.
2a6c0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
2a6d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2a6e0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
2a6f0 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
2a700 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
2a710 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20  ISAUTOVACUUM .  
2a720 20 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d         && (aFrom
2a730 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [j]==0xFF || apC
2a740 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70  opy[aFrom[j]]->p
2a750 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29  gno!=pNew->pgno)
2a760 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2a770 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2a780 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2a790 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41  te(pCell), PTRMA
2a7a0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
2a7b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2a7c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a7d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2a7e0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2a7f0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
2a800 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a810 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
2a820 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2a830 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
2a840 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
2a850 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
2a860 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
2a870 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
2a880 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
2a890 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
2a8a0 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
2a8b0 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
2a8c0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
2a8d0 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
2a8e0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
2a8f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
2a900 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
2a910 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
2a920 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
2a930 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
2a940 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
2a950 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
2a960 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
2a970 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
2a980 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
2a990 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
2a9a0 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2a9b0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
2a9c0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
2a9d0 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
2a9e0 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
2a9f0 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
2aa00 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
2aa10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2aa20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
2aa30 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
2aa40 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
2aa50 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
2aa60 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
2aa70 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
2aa80 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
2aa90 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
2aaa0 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
2aab0 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
2aac0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2aad0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
2aae0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
2aaf0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
2ab00 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
2ab10 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
2ab20 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
2ab30 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
2ab40 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
2ab50 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
2ab60 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
2ab70 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
2ab80 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
2ab90 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
2aba0 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
2abb0 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
2abc0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2abd0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2abe0 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
2abf0 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
2ac00 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
2ac10 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
2ac20 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
2ac30 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
2ac40 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
2ac50 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
2ac60 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
2ac70 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
2ac80 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
2ac90 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
2aca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2acb0 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
2acc0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2acd0 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
2ace0 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
2acf0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
2ad00 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
2ad10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ad20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63     }.      iSpac
2ad30 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e2 += sz;.      
2ad40 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
2ad50 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
2ad60 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
2ad70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace2<=pBt->pageS
2ad80 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ize );.      rc 
2ad90 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2ada0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
2adb0 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34  ll, sz, pTemp, 4
2adc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2add0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2ade0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2adf0 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  p;.      put4byt
2ae00 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2ae10 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
2ae20 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
2ae30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
2ae40 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2ae50 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e  uum database, an
2ae60 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74  d not a leaf-dat
2ae70 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a  a tree,.      **
2ae80 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65   then update the
2ae90 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74   pointer map wit
2aea0 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  h an entry for t
2aeb0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2aec0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
2aed0 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73  he cell just ins
2aee0 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20  erted points to 
2aef0 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
2af00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
2af10 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65  UTOVACUUM && !le
2af20 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
2af30 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2af40 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
2af50 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
2af60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2af70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2af80 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2af90 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2afa0 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a     }.      j++;.
2afb0 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
2afc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
2afd0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2afe0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
2aff0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2b000 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2b010 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2b020 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2b030 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
2b040 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2b050 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2b060 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2b070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b080 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2b090 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2b0a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2b0b0 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
2b0c0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
2b0d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
2b0e0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
2b0f0 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
2b100 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
2b110 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
2b120 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
2b130 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
2b140 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
2b150 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
2b160 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ild, 4);.    if(
2b170 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2b180 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2b190 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2b1a0 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52  yte(zChild), PTR
2b1b0 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
2b1c0 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
2b1d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2b1e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b1f0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2b200 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2b210 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2b220 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  ( nxDiv==pParent
2b230 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d  ->nCell+pParent-
2b240 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2b250 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2b260 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72  sibling is the r
2b270 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
2b280 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  of pParent */.  
2b290 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2b2a0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2b2b0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2b2c0 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2b2d0 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
2b2e0 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
2b2f0 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65  ibling is the le
2b300 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ft child of the 
2b310 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70  first entry in p
2b320 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61  Parent.    ** pa
2b330 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  st the right-mos
2b340 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20  t divider entry 
2b350 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2b360 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2b370 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
2b380 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2b390 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ]);.  }..  /*.  
2b3a0 2a 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c  ** Reparent chil
2b3b0 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  dren of all cell
2b3c0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
2b3d0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2b3e0 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
2b3f0 6e 74 43 68 69 6c 64 50 61 67 65 73 28 61 70 4e  ntChildPages(apN
2b400 65 77 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69  ew[i], 0);.    i
2b410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b420 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2b430 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
2b440 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
2b450 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 2c 20  dPages(pParent, 
2b460 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2b470 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
2b480 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2b490 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e  .  /*.  ** Balan
2b4a0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
2b4b0 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ge.  Note that t
2b4c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2b4d0 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20  (pPage) might.  
2b4e0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ** have been add
2b4f0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
2b500 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  st so it might n
2b510 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74  o longer be init
2b520 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75  ialized..  ** Bu
2b530 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2b540 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
2b550 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
2b560 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
2b570 72 65 6e 74 2d 3e 69 73 49 6e 69 74 3d 3d 50 41  rent->isInit==PA
2b580 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29  GE_ISINIT_FULL )
2b590 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2b5a0 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2b5b0 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20    apCell = 0;.  
2b5c0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2b5d0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
2b5e0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
2b5f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b600 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
2b610 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
2b620 50 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32  PageFree(aSpace2
2b630 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  );.  sqlite3Scra
2b640 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
2b650 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2b660 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
2b670 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
2b680 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
2b690 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
2b6a0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2b6b0 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
2b6c0 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
2b6d0 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43  pParent);.  TRAC
2b6e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2b6f0 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2b700 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2b710 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2b720 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2b730 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2b740 6c 6c 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ll));..  return 
2b750 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2b760 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2b770 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
2b780 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
2b790 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
2b7a0 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
2b7b0 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
2b7c0 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
2b7d0 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
2b7e0 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
2b7f0 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
2b800 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2b810 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
2b820 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
2b830 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2b840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b850 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
2b860 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
2b870 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2b880 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2b890 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
2b8a0 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
2b8b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b8c0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
2b8d0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2b8e0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2b8f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2b900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b910 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
2b920 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
2b930 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
2b940 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
2b950 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2b960 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
2b970 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2b980 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2b990 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
2b9a0 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
2b9b0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2b9c0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2b9f0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
2ba00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ba10 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
2ba20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ba30 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2ba40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ba50 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2ba60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2ba70 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2ba80 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
2ba90 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
2baa0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
2bab0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65  ite3Malloc( mxCe
2bac0 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
2bad0 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
2bae0 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
2baf0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2bb00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bb10 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2bb20 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
2bb30 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
2bb40 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2bb50 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
2bb60 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2bb70 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
2bb80 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
2bb90 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
2bba0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
2bbb0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
2bbc0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2bbd0 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
2bbe0 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
2bbf0 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
2bc00 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
2bc10 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
2bc20 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
2bc30 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
2bc40 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
2bc50 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
2bc60 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
2bc70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2bc80 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2bc90 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
2bca0 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
2bcb0 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
2bcc0 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
2bcd0 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
2bce0 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
2bcf0 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
2bd00 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
2bd10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
2bd20 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
2bd30 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
2bd40 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
2bd50 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2bd60 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
2bd70 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
2bd80 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
2bd90 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
2bda0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
2bdb0 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
2bdc0 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
2bdd0 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
2bde0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
2bdf0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
2be00 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
2be10 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
2be20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
2be30 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
2be40 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
2be50 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2be60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2be70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2be80 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
2be90 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2bea0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2beb0 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67  ( pgnoChild<=pag
2bec0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2bed0 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20  e->pBt->pPager) 
2bee0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2bef0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2bf00 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f  pPage->pBt, pgno
2bf10 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20  Child, &pChild, 
2bf20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2bf30 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2bf40 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69  w_balance;.    i
2bf50 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  f( pPage->pgno==
2bf60 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
2bf70 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2bf80 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61  Page(pChild, pPa
2bf90 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2bfa0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
2bfb0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
2bfc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
2bfd0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ld->nOverflow==0
2bfe0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
2bff0 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30  hild->nFree>=100
2c000 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2c010 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61  he child informa
2c020 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tion will fit on
2c030 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
2c040 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20  so do the.      
2c050 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20    ** copy */.   
2c060 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2c070 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2c080 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2c090 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  a[0]);.        f
2c0a0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2c0b0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2c0c0 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b           apCell[
2c0d0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43  i] = findCell(pC
2c0e0 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20  hild,i);.       
2c0f0 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63     szCell[i] = c
2c100 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c  ellSizePtr(pChil
2c110 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20  d, apCell[i]);. 
2c120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c130 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50   assemblePage(pP
2c140 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65  age, pChild->nCe
2c150 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65  ll, apCell, szCe
2c160 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ll);.        /* 
2c170 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70  Copy the right-p
2c180 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
2c190 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ild to the paren
2c1a0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  t. */.        pu
2c1b0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2c1c0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2c1d0 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20  ffset+8], .     
2c1e0 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
2c1f0 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70  &pChild->aData[p
2c200 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  Child->hdrOffset
2c210 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66  +8]));.        f
2c220 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
2c230 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2c240 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
2c250 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70  %d transfer to p
2c260 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2c270 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2c280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2c290 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20  * The child has 
2c2a0 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2c2b0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f   that will fit o
2c2c0 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20  n the root..    
2c2d0 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20      ** The tree 
2c2e0 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e  is already balan
2c2f0 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67  ced.  Do nothing
2c300 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41  . */.        TRA
2c310 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2c320 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20  ild %d will not 
2c330 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22  fit on page 1\n"
2c340 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2c350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c360 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
2c370 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  y(pPage->aData, 
2c380 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70  pChild->aData, p
2c390 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2c3a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
2c3b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2c3c0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
2c3d0 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  arent = 0;.     
2c3e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2c3f0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
2c400 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
2c410 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2c420 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50  K );.      freeP
2c430 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2c440 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2c450 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69  CE: transfer chi
2c460 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20  ld %d into root 
2c470 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2c480 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e       pChild->pgn
2c490 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  o, pPage->pgno))
2c4a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2c4b0 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
2c4c0 67 65 73 28 70 50 61 67 65 2c 20 31 29 3b 0a 20  ges(pPage, 1);. 
2c4d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c4e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2c4f0 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
2c500 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2c510 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
2c520 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2c530 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  Cell; i++){ .   
2c540 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2c550 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69  PutOvfl(pPage, i
2c560 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c580 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2c590 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2c5a0 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
2c5b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c5c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2c5d0 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61  ld);.  }.end_sha
2c5e0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20  llow_balance:.  
2c5f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43  sqlite3_free(apC
2c600 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ell);.  return r
2c610 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
2c620 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76   root page is ov
2c630 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65  erfull.**.** Whe
2c640 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  n this happens, 
2c650 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  Create a new chi
2c660 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79  ld page and copy
2c670 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
2c680 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74   of the root int
2c690 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68  o the child.  Th
2c6a0 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74  en make the root
2c6b0 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74  .** page an empt
2c6c0 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68  y page with righ
2c6d0 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20  tChild pointing 
2c6e0 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68  to the new.** ch
2c6f0 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20  ild.   Finally, 
2c700 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74  call balance_int
2c710 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e  ernal() on the n
2c720 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63  ew child.** to c
2c730 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74  ause it to split
2c740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c750 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
2c760 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
2c770 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2c780 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2c790 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
2c7a0 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
2c7b0 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2c7c0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c7d0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2c7e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2c7f0 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67  hild;     /* Pag
2c800 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2c810 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2c820 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2c830 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t;         /* Th
2c840 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e BTree */.  int
2c850 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
2c860 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65   /* Total usable
2c870 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
2c880 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2c890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2c8a0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ent of the paren
2c8b0 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  t page */.  u8 *
2c8c0 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  cdata;          
2c8d0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2c8e0 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  e child page */.
2c8f0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2c900 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2c910 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69  to page header i
2c920 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e  n parent */.  in
2c930 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
2c940 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2c950 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20  ontent of first 
2c960 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a  cell in parent *
2c970 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
2c980 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ge->pParent==0 )
2c990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2c9a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2c9b0 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
2c9c0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2c9d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2c9e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2c9f0 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  ;.  rc = allocat
2ca00 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2ca10 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
2ca20 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
2ca30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2ca40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
2ca50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2ca60 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
2ca70 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
2ca80 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
2ca90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2caa0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2cab0 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
2cac0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2cad0 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  t;.  cbrk = get2
2cae0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2caf0 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
2cb00 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
2cb10 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
2cb20 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
2cb30 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
2cb40 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
2cb50 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
2cb60 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72  cbrk], &data[cbr
2cb70 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63  k], usableSize-c
2cb80 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 43 68 69  brk);.  if( pChi
2cb90 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45  ld->isInit==PAGE
2cba0 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 20 72  _ISINIT_FULL ) r
2cbb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2cbc0 52 55 50 54 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RUPT;.  rc = sql
2cbd0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2cbe0 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2cbf0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2cc00 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2cc10 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
2cc20 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
2cc30 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
2cc40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2cc50 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2cc60 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
2cc70 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2cc80 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2cc90 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
2cca0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
2ccb0 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
2ccc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2ccd0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2cce0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
2ccf0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2cd00 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
2cd10 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
2cd20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2cd30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2cd40 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2cd50 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
2cd60 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2cd70 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2cd80 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2cd90 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2cda0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2cdb0 55 55 4d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  UUM ){.    int i
2cdc0 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
2cdd0 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
2cde0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
2cdf0 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
2ce00 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2ce10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
2ce20 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
2ce30 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
2ce40 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2ce50 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2ce60 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
2ce70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ce80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce90 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2cea0 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20  edeeper_out;.   
2ceb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2cec0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
2ced0 64 50 61 67 65 73 28 70 43 68 69 6c 64 2c 20 31  dPages(pChild, 1
2cee0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2cef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cf00 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2cf10 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a  onroot(pChild);.
2cf20 20 20 7d 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70    }..balancedeep
2cf30 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  er_out:.  releas
2cf40 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2cf50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2cf60 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74  *.** Decide if t
2cf70 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65  he page pPage ne
2cf80 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
2cf90 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e  ed.  If balancin
2cfa0 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  g is.** required
2cfb0 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f  , call the appro
2cfc0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
2cfd0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
2cfe0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
2cff0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2d000 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69  int insert){.  i
2d010 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d020 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  K;.  assert( sql
2d030 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d040 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2d050 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
2d060 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  e->pParent==0 ){
2d070 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d080 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2d090 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2d0a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d0b0 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
2d0c0 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
2d0d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
2d0e0 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20  eeper(pPage);.  
2d0f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2d100 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2d110 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
2d120 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2d130 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61  ce_shallower(pPa
2d140 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ge);.    }.  }el
2d150 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2d160 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
2d170 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73  | .        (!ins
2d180 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
2d190 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
2d1a0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
2d1b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2d1c0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
2d1d0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
2d1e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d1f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2d200 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
2d210 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
2d220 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
2d230 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
2d240 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
2d250 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
2d260 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
2d270 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
2d280 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2d290 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
2d2a0 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
2d2b0 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
2d2c0 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
2d2d0 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
2d2e0 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
2d2f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
2d300 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
2d310 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
2d320 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
2d330 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2d340 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
2d350 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  ED..**.** As wel
2d360 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74  l as cursors wit
2d370 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72  h wrFlag==0, cur
2d380 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67  sors with wrFlag
2d390 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e  ==1 and .** isIn
2d3a0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20  crblobHandle==1 
2d3b0 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65  are also conside
2d3c0 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f  red 'read' curso
2d3d0 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20  rs. Incremental 
2d3e0 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  .** blob cursors
2d3f0 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f   are used for bo
2d400 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
2d410 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  riting..**.** Wh
2d420 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  en pgnoRoot is t
2d430 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2d440 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
2d450 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d460 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e  s also.** respon
2d470 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69  sible for invali
2d480 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74  dating increment
2d490 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2d4a0 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72  when the table r
2d4b0 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  ow.** on which t
2d4c0 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69  hey are opened i
2d4d0 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64  s deleted or mod
2d4e0 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61  ified. Cursors a
2d4f0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
2d500 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  * according to t
2d510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c  he following rul
2d520 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2d530 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61  hen BtreeClearTa
2d540 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ble() is called 
2d550 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65  to completely de
2d560 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lete the content
2d570 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42  s.**      of a B
2d580 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78  -Tree table, pEx
2d590 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
2d5a0 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74  zero and paramet
2d5b0 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20  er iRow is .**  
2d5c0 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a      set to non-z
2d5d0 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
2d5e0 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  e all incrementa
2d5f0 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  l blob cursors o
2d600 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  pen.**      on t
2d610 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2d620 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20  at pgnoRoot are 
2d630 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2d640 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72  **   2) When Btr
2d650 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65  eeInsert(), Btre
2d660 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2d670 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63  eePutData() is c
2d680 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20  alled to .**    
2d690 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65    modify a table
2d6a0 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20   row via an SQL 
2d6b0 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c  statement, pExcl
2d6c0 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ude is set to th
2d6d0 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65  e .**      write
2d6e0 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
2d6f0 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74  do the modificat
2d700 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ion and paramete
2d710 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a  r iRow is set.**
2d720 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
2d730 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74  eger row id of t
2d740 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20  he B-Tree entry 
2d750 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
2d760 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70  Unless.**      p
2d770 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c  Exclude is itsel
2d780 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
2d790 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68   blob cursor, th
2d7a0 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  en all increment
2d7b0 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20  al.**      blob 
2d7c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2d7d0 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20  row iRow of the 
2d7e0 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c  B-Tree are inval
2d7f0 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2d800 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c  3) If both pExcl
2d810 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65  ude and iRow are
2d820 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f   set to zero, no
2d830 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2d840 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f  b .**      curso
2d850 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2d860 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d870 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
2d880 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
2d890 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  e, .  Pgno pgnoR
2d8a0 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f 72  oot, .  BtCursor
2d8b0 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69 36   *pExclude,.  i6
2d8c0 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75  4 iRow.){.  BtCu
2d8d0 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
2d8e0 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
2d8f0 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
2d900 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
2d910 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
2d920 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2d930 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
2d940 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
2d950 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
2d960 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
2d970 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
2d980 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
2d990 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
2d9a0 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
2d9b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d9c0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2d9d0 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c   if( p->isIncrbl
2d9e0 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20  obHandle && ( . 
2d9f0 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75          (!pExclu
2da00 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20  de && iRow).    
2da10 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26    || (pExclude &
2da20 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49  & !pExclude->isI
2da30 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2da40 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
2da50 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  Row).    )){.   
2da60 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
2da70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2da80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2da90 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2daa0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2dab0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2dac0 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69  p->wrFlag==0 .#i
2dad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2dae0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
2daf0 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  || p->isIncrblob
2db00 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20  Handle.#endif.  
2db10 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
2db20 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
2db30 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
2db40 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d     if( dbOther==
2db50 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64  0 ||.         (d
2db60 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64  bOther!=db && (d
2db70 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20  bOther->flags & 
2db80 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2db90 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20  mitted)==0) ){. 
2dba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dbb0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
2dbc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2dbd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2dbe0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
2dbf0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2dc00 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2dc10 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2dc20 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2dc30 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2dc40 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2dc50 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2dc60 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2dc70 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2dc80 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2dc90 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2dca0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2dcb0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2dcc0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2dcd0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2dce0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2dcf0 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2dd00 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2dd10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2dd20 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2dd30 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2dd40 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2dd50 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2dd60 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2dd70 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2dd80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2dd90 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2dda0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2ddb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2ddc0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2ddd0 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2dde0 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2ddf0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2de00 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2de10 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2de20 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2de30 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2de40 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
2de50 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2de60 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2de70 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2de80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2de90 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
2dea0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2deb0 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
2dec0 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dee0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2def0 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
2df00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2df10 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
2df20 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61  t szNew;.  MemPa
2df30 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
2df40 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
2df50 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
2df60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2df70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2df80 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
2df90 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
2dfa0 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
2dfb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2dfc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
2dfd0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2dfe0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2dff0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2e000 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2e010 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2e020 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ng an insert */.
2e030 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2e040 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2e050 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2e060 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2e070 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2e080 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2e090 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
2e0a0 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2e0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e0c0 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
2e0d0 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
2e0e0 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2e0f0 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2e100 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2e110 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2e120 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b  , pCur, nKey) ){
2e130 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e140 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
2e150 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
2e160 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
2e170 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
2e180 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2e190 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2e1a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
2e1b0 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20  r->skip;.  }..  
2e1c0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2e1d0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
2e1e0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
2e1f0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  on this table */
2e200 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f  .  clearCursorPo
2e210 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2e220 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f  if( .    SQLITE_
2e230 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2e240 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2e250 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2e260 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49  ur)) ||.    SQLI
2e270 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
2e280 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2e290 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pCur, pKey, nKey
2e2a0 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c  , appendBias, &l
2e2b0 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  oc)).  ){.    re
2e2c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2e2d0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2e2e0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2e2f0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
2e300 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
2e310 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2e320 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b   || !pPage->intK
2e330 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ey );.  TRACE(("
2e340 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
2e350 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
2e360 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
2e370 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
2e380 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
2e390 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
2e3a0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2e3b0 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
2e3c0 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
2e3d0 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
2e3e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
2e3f0 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
2e400 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
2e410 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
2e420 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
2e430 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
2e440 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
2e450 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e460 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
2e470 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
2e480 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
2e490 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
2e4a0 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
2e4b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2e4c0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
2e4d0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
2e4e0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
2e4f0 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
2e500 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
2e510 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
2e520 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20    if( loc==0 && 
2e530 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2e540 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2e550 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
2e560 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e570 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
2e580 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2e590 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e5a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2e5b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2e5c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e5d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
2e5e0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
2e5f0 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2e600 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2e610 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2e620 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e630 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2e640 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2e650 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2e660 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2e670 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2e680 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2e690 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2e6a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2e6b0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2e6c0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2e6d0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2e6e0 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2e6f0 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2e700 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2e710 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e720 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2e730 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2e740 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2e750 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
2e760 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
2e770 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2e780 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2e790 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
2e7a0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2e7b0 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ur->idx, newCell
2e7c0 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
2e7d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e7e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69  _OK ) goto end_i
2e7f0 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61  nsert;.  rc = ba
2e800 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b  lance(pPage, 1);
2e810 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2e830 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2e840 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2e850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e860 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
2e870 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
2e880 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2e890 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
2e8a0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2e8b0 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2e8c0 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
2e8d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
2e8e0 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
2e8f0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2e900 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2e910 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Page;.  unsigned
2e920 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2e930 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
2e940 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
2e950 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2e960 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2e970 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2e980 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
2e990 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2e9a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e9b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
2e9c0 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c  =PAGE_ISINIT_FUL
2e9d0 4c 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  L );.  if( pBt->
2e9e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2e9f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2ea00 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2ea10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2ea20 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c  fore doing a del
2ea30 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ete */.    rc = 
2ea40 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2ea50 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2ea60 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2ea70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ea80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2ea90 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2eaa0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2eab0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2eac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
2ead0 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
2eae0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2eaf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2eb00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2eb10 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2eb20 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2eb30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2eb40 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2eb50 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2eb60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2eb70 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2eb80 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2eb90 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2eba0 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2ebb0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2ebc0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2ebd0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2ebe0 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  Cur, pCur->info.
2ebf0 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74  nKey) ){.    ret
2ec00 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2ec10 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
2ec20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
2ec30 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
2ec40 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
2ec50 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2ec60 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
2ec70 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
2ec80 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
2ec90 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
2eca0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
2ecb0 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
2ecc0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2ecd0 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
2ece0 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
2ecf0 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
2ed00 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
2ed10 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
2ed20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
2ed30 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
2ed40 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
2ed50 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
2ed60 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2ed70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ed80 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2ed90 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2eda0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2edb0 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
2edc0 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
2edd0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2ede0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2edf0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2ee00 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2ee10 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
2ee20 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
2ee30 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
2ee40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2ee50 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
2ee60 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
2ee70 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
2ee80 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2ee90 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
2eea0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
2eeb0 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
2eec0 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
2eed0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2eee0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2eef0 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
2ef00 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
2ef10 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2ef20 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
2ef30 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2ef40 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2ef50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ef60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2ef70 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ef80 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2ef90 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2efa0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2efb0 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2efc0 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2efd0 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2efe0 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2eff0 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2f000 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2f010 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2f020 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2f030 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2f040 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2f050 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2f060 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2f070 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2f080 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2f090 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2f0a0 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2f0b0 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2f0c0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2f0d0 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2f0e0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2f0f0 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2f100 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2f110 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f120 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2f130 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2f140 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
2f150 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
2f160 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2f170 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2f180 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2f190 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2f1a0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2f1b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f1c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2f1d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f1e0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2f1f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2f200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 31  E_OK ){.      u1
2f220 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20  6 szNext;.      
2f230 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2f240 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2f250 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64  internal from %d
2f260 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65   replace from le
2f270 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
2f280 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2f290 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
2f2a0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2f2b0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f  gno));.      dro
2f2c0 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2f2d0 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  r->idx, cellSize
2f2e0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2f2f0 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  ));.      pNext 
2f300 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43  = findCell(leafC
2f310 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75  ur.pPage, leafCu
2f320 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a  r.idx);.      sz
2f330 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
2f340 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  tr(leafCur.pPage
2f350 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
2f360 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
2f370 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78  SIZE(pBt)>=szNex
2f380 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  t+4 );.      all
2f390 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2f3a0 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  Bt);.      tempC
2f3b0 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
2f3c0 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20  pace;.      if( 
2f3d0 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
2f3e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f3f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2f400 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2f410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f420 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2f430 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2f440 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20  ->idx, pNext-4, 
2f450 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65  szNext+4, tempCe
2f460 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
2f470 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f490 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2f4a0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2f4b0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c 20  ge, pCur->idx), 
2f4c0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
2f4d0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2f4e0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
2f4f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f510 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
2f520 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c  leafCur.pPage, l
2f530 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65  eafCur.idx, szNe
2f540 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  xt);.        rc 
2f550 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75  = balance(leafCu
2f560 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  r.pPage, 0);.   
2f570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2f580 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
2f590 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
2f5a0 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
2f5b0 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
2f5c0 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
2f5d0 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
2f5e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
2f5f0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
2f600 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2f610 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2f620 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
2f630 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2f640 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell));.    rc = 
2f650 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
2f660 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2f670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f680 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
2f690 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2f6a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
2f6b0 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
2f6c0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
2f6d0 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
2f6e0 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2f6f0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
2f700 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2f710 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
2f720 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
2f730 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
2f740 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
2f750 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
2f760 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
2f770 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
2f780 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
2f790 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
2f7a0 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
2f7b0 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
2f7c0 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
2f7d0 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
2f7e0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
2f7f0 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
2f800 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
2f810 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
2f830 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
2f840 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
2f850 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
2f860 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2f870 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
2f880 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
2f890 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2f8a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
2f8b0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
2f8c0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
2f8d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2f8e0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2f8f0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
2f900 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2f910 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2f920 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2f930 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
2f940 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  rst */.    rc = 
2f950 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2f960 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2f970 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2f980 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f990 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2f9a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
2f9b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2f9c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2f9d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2f9e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2f9f0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2fa00 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2fa10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2fa20 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
2fa30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2fa40 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2fa50 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
2fa60 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
2fa70 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
2fa80 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
2fa90 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2faa0 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
2fab0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2fac0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
2fad0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
2fae0 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
2faf0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
2fb00 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
2fb10 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
2fb20 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
2fb30 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
2fb40 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
2fb50 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
2fb60 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
2fb70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2fb80 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
2fb90 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
2fba0 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
2fbb0 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
2fbc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
2fbd0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
2fbe0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
2fbf0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
2fc00 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
2fc10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2fc20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2fc30 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
2fc40 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2fc50 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
2fc60 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
2fc70 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2fc80 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
2fc90 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
2fca0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2fcb0 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
2fcc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2fcd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2fce0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e  tMeta(p, 4, &pgn
2fcf0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2fd00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fd10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2fd20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f  ;.    }.    pgno
2fd30 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
2fd40 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
2fd50 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
2fd60 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
2fd70 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
2fd80 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
2fd90 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20  ING_BYTE page.. 
2fda0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
2fdb0 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41   pgnoRoot==PTRMA
2fdc0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67  P_PAGENO(pBt, pg
2fdd0 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20  noRoot) ||.     
2fde0 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e     pgnoRoot==PEN
2fdf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2fe00 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  Bt) ){.      pgn
2fe10 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  oRoot++;.    }. 
2fe20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52     assert( pgnoR
2fe30 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f  oot>=3 );..    /
2fe40 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67  * Allocate a pag
2fe50 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74  e. The page that
2fe60 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64   currently resid
2fe70 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77  es at pgnoRoot w
2fe80 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f  ill.    ** be mo
2fe90 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ved to the alloc
2fea0 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73  ated page (unles
2feb0 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  s the allocated 
2fec0 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20  page happens.   
2fed0 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74   ** to reside at
2fee0 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20   pgnoRoot)..    
2fef0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  */.    rc = allo
2ff00 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2ff10 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26  t, &pPageMove, &
2ff20 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f  pgnoMove, pgnoRo
2ff30 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ot, 1);.    if( 
2ff40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ff50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2ff60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2ff70 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52   pgnoMove!=pgnoR
2ff80 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oot ){.      /* 
2ff90 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20  pgnoRoot is the 
2ffa0 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62  page that will b
2ffb0 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
2ffc0 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20  oot-page of.    
2ffd0 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62    ** the new tab
2ffe0 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20  le (assuming an 
2fff0 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63  error did not oc
30000 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72  cur). But we wer
30010 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  e.      ** alloc
30020 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49  ated pgnoMove. I
30030 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e  f required (i.e.
30040 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
30050 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a  llocated.      *
30060 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74  * by extending t
30070 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75  he file), the cu
30080 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f  rrent page at po
30090 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a  sition pgnoMove.
300a0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65        ** is alre
300b0 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20  ady journaled.. 
300c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38       */.      u8
300d0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67   eType;.      Pg
300e0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
300f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30100 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20  pPageMove);..   
30110 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70     /* Move the p
30120 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74  age currently at
30130 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e   pgnoRoot to pgn
30140 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  oMove. */.      
30150 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30160 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
30170 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
30180 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
30190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
301a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
301b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
301c0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
301d0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65  Bt, pgnoRoot, &e
301e0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
301f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
30200 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79  SQLITE_OK || eTy
30210 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
30220 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  AGE || eType==PT
30230 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
30240 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30250 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
30260 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
30280 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
30290 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
302a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
302b0 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype!=PTRMAP_FREE
302c0 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63  PAGE );.      rc
302d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
302e0 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
302f0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30310 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30320 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
30330 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
30350 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
30360 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70  pBt, pRoot, eTyp
30370 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e  e, iPtrPage, pgn
30380 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  oMove, 0);.     
30390 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
303a0 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ot);..      /* O
303b0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61  btain the page a
303c0 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20  t pgnoRoot */.  
303d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
303e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
303f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30400 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
30410 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
30420 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
30430 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
30440 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30460 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30470 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
30480 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30490 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
304a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
304b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
304c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
304d0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
304e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
304f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
30500 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
30510 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
30520 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
30530 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
30540 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
30550 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
30560 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
30570 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
30580 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
30590 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
305a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
305b0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
305c0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
305d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
305e0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
305f0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
30600 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f  eta(p, 4, pgnoRo
30610 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ot);.    if( rc 
30620 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
30630 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
30640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30650 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
30660 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
30670 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
30680 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
30690 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
306a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
306b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
306c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
306d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
306e0 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
306f0 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
30700 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
30710 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  AF);.  sqlite3Pa
30720 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  gerUnref(pRoot->
30730 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54  pDbPage);.  *piT
30740 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
30750 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
30760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
30770 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
30780 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
30790 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
307a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
307b0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
307c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
307d0 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
307e0 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
307f0 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
30800 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
30810 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
30820 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
30830 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
30840 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
30850 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
30860 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
30870 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
30880 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
30890 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
308a0 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
308b0 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
308c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
308d0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
308e0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
308f0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
30900 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
30910 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
30920 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
30930 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
30940 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
30950 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20  page.  NULL for 
30960 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e  the root */.  in
30970 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20  t freePageFlag  
30980 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
30990 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
309a0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
309b0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
309c0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
309d0 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
309e0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
309f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30a00 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
30a10 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61  );.  if( pgno>pa
30a20 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
30a30 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
30a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30a50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
30a60 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
30a70 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
30a80 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
30a90 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
30aa0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
30ab0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
30ac0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
30ad0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
30ae0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
30af0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
30b00 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30b10 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
30b20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
30b30 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
30b40 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 31  pCell), pPage, 1
30b50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
30b60 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
30b70 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
30b80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
30b90 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
30ba0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
30bb0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
30bc0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
30bd0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
30be0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
30bf0 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
30c00 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
30c10 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
30c20 38 5d 29 2c 20 70 50 61 67 65 2c 20 31 29 3b 0a  8]), pPage, 1);.
30c30 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
30c40 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
30c50 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
30c60 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
30c70 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
30c80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
30c90 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
30ca0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30cb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
30cd0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
30ce0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
30cf0 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
30d00 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
30d10 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
30d20 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
30d30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30d40 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
30d50 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
30d60 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
30d70 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
30d80 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
30d90 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
30da0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
30db0 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
30dc0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
30dd0 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
30de0 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
30df0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
30e00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
30e10 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
30e20 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
30e30 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
30e40 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
30e50 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
30e60 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
30e70 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
30e80 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
30e90 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
30ea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
30eb0 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
30ec0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
30ed0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
30ee0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
30ef0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
30f00 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
30f10 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
30f20 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
30f30 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
30f40 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
30f50 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
30f60 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
30f70 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
30f80 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63 68  lse if( (rc = ch
30f90 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
30fa0 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d  iTable, 0, 1))!=
30fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30fc0 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
30fd0 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  o */.  }else if(
30fe0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
30ff0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
31000 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29  (pBt, iTable, 0)
31010 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68  ) ){.    /* noth
31020 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d  ing to do */.  }
31030 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63  else{.    rc = c
31040 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
31050 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
31060 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  le, 0, 0);.  }. 
31070 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
31080 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
31090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
310a0 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  se all informati
310b0 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e  on in a table an
310c0 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f  d add the root o
310d0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a  f the table to.*
310e0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  * the freelist. 
310f0 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f   Except, the roo
31100 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70  t of the princip
31110 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e  le table (the on
31120 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20  e on.** page 1) 
31130 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74  is never added t
31140 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
31150 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
31160 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
31170 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
31180 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
31190 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73   open.** cursors
311a0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   on the table..*
311b0 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
311c0 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e  UM is enabled an
311d0 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54  d the page at iT
311e0 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20  able is not the 
311f0 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67  last.** root pag
31200 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
31210 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
31220 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
31230 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
31240 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65  ase file is move
31250 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20  d into the slot 
31260 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
31270 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61  d by.** iTable a
31280 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f  nd that last slo
31290 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
312a0 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20  ied by the last 
312b0 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
312c0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
312d0 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66  elist instead of
312e0 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69   iTable.  In thi
312f0 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f  s say, all.** ro
31300 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70  ot pages are kep
31310 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  t at the beginni
31320 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
31330 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a  se file, which.*
31340 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  * is necessary f
31350 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f  or AUTOVACUUM to
31360 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70   work right.  *p
31370 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
31380 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75   the .** page nu
31390 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74  mber that used t
313a0 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f  o be the last ro
313b0 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  ot page in the f
313c0 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ile before.** th
313d0 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70  e move.  If no p
313e0 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20  age gets moved, 
313f0 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
31400 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  to 0..** The las
31410 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72  t root page is r
31420 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b  ecorded in meta[
31430 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  3] and the value
31440 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69   of.** meta[3] i
31450 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69  s updated by thi
31460 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a  s procedure..*/.
31470 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
31480 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
31490 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
314a0 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20  int *piMoved){. 
314b0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
314c0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
314d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
314e0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
314f0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
31500 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
31510 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
31520 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
31530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
31540 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
31550 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
31560 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
31570 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
31580 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74  egal to drop a t
31590 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73  able if any curs
315a0 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  ors are open on 
315b0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
315c0 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  e. This is becau
315d0 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
315e0 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65  m mode the backe
315f0 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64  nd may.  ** need
31600 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72   to move another
31610 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69   root-page to fi
31620 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79  ll a gap left by
31630 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a   the deleted.  *
31640 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20  * root page. If 
31650 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
31660 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61  as using this pa
31670 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75  ge a problem wou
31680 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a  ld .  ** occur..
31690 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
316a0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
316b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
316c0 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KED;.  }..  rc =
316d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
316e0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
316f0 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20  iTable, &pPage, 
31700 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
31710 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
31720 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
31730 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  arTable(p, iTabl
31740 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
31750 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31760 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
31770 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rn rc;.  }..  *p
31780 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69  iMoved = 0;..  i
31790 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23  f( iTable>1 ){.#
317a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
317b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
317c0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
317d0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Page);.    relea
317e0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23  sePage(pPage);.#
317f0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74  else.    if( pBt
31800 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
31810 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f        Pgno maxRo
31820 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63  otPgno;.      rc
31830 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
31840 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61  etMeta(p, 4, &ma
31850 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
31860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
31880 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
31890 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
318a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
318b0 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
318c0 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
318d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
318e0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
318f0 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
31900 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
31910 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
31920 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
31930 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
31940 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
31950 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
31960 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
31970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
31980 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
31990 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
319a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
319b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
319c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
319d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
319e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
319f0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
31a00 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
31a10 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
31a20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
31a30 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
31a40 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
31a50 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
31a60 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
31a70 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
31a80 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
31a90 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
31aa0 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
31ab0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31ac0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
31ad0 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
31ae0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
31af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31b00 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
31b10 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
31b20 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
31b30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31b50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31b70 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
31b80 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
31b90 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
31ba0 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b  , 0, iTable, 0);
31bb0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
31bc0 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
31bd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31bf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
31c20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
31c30 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
31c40 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
31c50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31c60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
31c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
31c80 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
31c90 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
31ca0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
31cb0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
31cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31d00 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
31d10 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
31d20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
31d30 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
31d40 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
31d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
31d60 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
31d70 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
31d80 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
31d90 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
31da0 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
31db0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
31dc0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
31dd0 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
31de0 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
31df0 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
31e00 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
31e10 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
31e20 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
31e30 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
31e40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31e50 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
31e60 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
31e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31e80 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
31e90 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
31ea0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
31eb0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
31ec0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
31ed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
31ee0 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
31ef0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
31f00 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
31f10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
31f20 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
31f30 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
31f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
31f50 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
31f60 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
31f70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31f80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
31f90 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
31fa0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
31fb0 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
31fc0 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
31fd0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
31fe0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
31ff0 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
32000 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
32010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32020 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
32030 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
32040 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
32050 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
32060 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
32070 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
32080 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
32090 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
320a0 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c   = btreeDropTabl
320b0 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d  e(p, iTable, piM
320c0 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  oved);.  sqlite3
320d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
320e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
320f0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d  /*.** Read the m
32100 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
32110 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  out of a databas
32120 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d  e file.  Meta[0]
32130 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65  .** is the numbe
32140 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
32150 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
32160 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
32170 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d  [1].** through m
32180 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69  eta[15] are avai
32190 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79  lable for use by
321a0 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20   higher layers. 
321b0 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72   Meta[0].** is r
321c0 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74  ead-only, the ot
321d0 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72  hers are read/wr
321e0 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ite..** .** The 
321f0 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d  schema layer num
32200 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73  bers meta values
32210 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41   differently.  A
32220 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20  t the schema.** 
32230 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53  layer (and the S
32240 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61  etCookie and Rea
32250 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29  dCookie opcodes)
32260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
32270 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20  * free pages is 
32280 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f  not visible.  So
32290 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68   Cookie[0] is th
322a0 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31  e same as Meta[1
322b0 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ]..*/.int sqlite
322c0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74  3BtreeGetMeta(Bt
322d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
322e0 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20   u32 *pMeta){.  
322f0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
32300 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
32310 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
32320 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32330 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
32340 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
32350 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
32360 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61  p->db;..  /* Rea
32370 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61  ding a meta-data
32380 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20   value requires 
32390 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  a read-lock on p
323a0 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65  age 1 (and hence
323b0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
323c0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57  _master table. W
323d0 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b  e grab this lock
323e0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
323f0 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e  hether or.  ** n
32400 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  ot the SQLITE_Re
32410 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
32420 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74  ag is set (the t
32430 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
32440 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72  age.  ** 1 is tr
32450 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69  eated as a speci
32460 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79  al case by query
32470 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20  TableLock() and 
32480 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20  lockTable())..  
32490 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  */.  rc = queryT
324a0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
324b0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
324c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
324d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
324e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
324f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
32500 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
32510 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
32520 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
32530 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62   ){.    /* The b
32540 2d 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  -tree is already
32550 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
32560 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f  ence to page 1 o
32570 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
32580 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74     ** file. In t
32590 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 71  his case the req
325a0 75 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20  uired meta-data 
325b0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61  value can be rea
325c0 64 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a  d directly.    *
325d0 2a 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  * from the page 
325e0 64 61 74 61 20 6f 66 20 74 68 69 73 20 72 65 66  data of this ref
325f0 65 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20  erence. This is 
32600 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
32610 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75  than.    ** requ
32620 65 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66  esting a new ref
32630 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20  erence from the 
32640 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20  pager layer..   
32650 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75   */.    pP1 = (u
32660 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
32670 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
32680 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
32690 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f  /* The b-tree do
326a0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  es not have a re
326b0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
326c0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
326d0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f  e file..    ** O
326e0 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74  btain one from t
326f0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a  he pager layer..
32700 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32710 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
32720 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
32730 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  &pDbPage);.    i
32740 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73  f( rc ){.      s
32750 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
32760 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
32770 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
32780 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
32790 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
327a0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
327b0 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74  ge);.  }.  *pMet
327c0 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  a = get4byte(&pP
327d0 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a  1[36 + idx*4]);.
327e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74  .  /* If the b-t
327f0 72 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69  ree is not holdi
32800 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
32810 6f 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f  o page 1, then o
32820 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71  ne was .  ** req
32830 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
32840 70 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74  pager layer in t
32850 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
32860 52 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  Release it now..
32870 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d    */.  if( !pBt-
32880 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73  >pPage1 ){.    s
32890 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
328a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
328b0 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
328c0 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
328d0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
328e0 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
328f0 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
32900 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
32910 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
32920 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
32930 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
32940 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
32950 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32960 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
32970 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
32980 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
32990 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20  ndif..  /* Grab 
329a0 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  the read-lock on
329b0 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63   page 1. */.  rc
329c0 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
329d0 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
329e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
329f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
32a00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
32a10 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
32a20 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
32a30 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
32a40 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
32a50 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
32a60 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
32a70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32a80 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
32a90 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
32aa0 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
32ab0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
32ac0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
32ad0 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
32ae0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
32af0 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
32b00 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
32b10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
32b20 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
32b30 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
32b40 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
32b50 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
32b60 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
32b70 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
32b80 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
32b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
32ba0 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
32bb0 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50     pP1 = pBt->pP
32bc0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
32bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32be0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
32bf0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
32c00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
32c20 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
32c30 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
32c40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32c50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32c60 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37        if( idx==7
32c70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
32c80 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
32c90 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20  uum || iMeta==0 
32ca0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32cb0 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69  t( iMeta==0 || i
32cc0 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Meta==1 );.     
32cd0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
32ce0 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20  um = iMeta;.    
32cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
32d00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
32d10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
32d20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32d30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c  ** Return the fl
32d40 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62  ag byte at the b
32d50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
32d60 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75  page that the cu
32d70 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
32d80 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
32d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
32da0 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72  BtreeFlags(BtCur
32db0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
32dc0 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75   TODO: What abou
32dd0 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  t CURSOR_REQUIRE
32de0 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62  SEEK state? Prob
32df0 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c  ably need to cal
32e00 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75  l.  ** restoreCu
32e10 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68  rsorPosition() h
32e20 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50  ere..  */.  MemP
32e30 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65  age *pPage;.  re
32e40 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
32e50 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ion(pCur);.  pPa
32e60 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
32e70 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
32e80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
32e90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
32ea0 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72  pPage->pBt==pCur
32eb0 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72  ->pBt );.  retur
32ec0 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
32ed0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
32ee0 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
32ef0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
32f00 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
32f10 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
32f20 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
32f30 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
32f40 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
32f50 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
32f60 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
32f70 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
32f80 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
32f90 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
32fa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32fb0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32fc0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
32fd0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
32fe0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
32ff0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
33000 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
33010 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
33020 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
33030 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
33040 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
33050 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
33060 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
33070 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20  pCheck->mxErr ) 
33080 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b  return;.  pCheck
33090 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68  ->mxErr--;.  pCh
330a0 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76  eck->nErr++;.  v
330b0 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
330c0 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65  mat);.  if( pChe
330d0 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72  ck->errMsg.nChar
330e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
330f0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70  trAccumAppend(&p
33100 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22  Check->errMsg, "
33110 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  \n", 1);.  }.  i
33120 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20  f( zMsg1 ){.    
33130 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
33140 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65  ppend(&pCheck->e
33150 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31  rrMsg, zMsg1, -1
33160 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
33170 56 58 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b  VXPrintf(&pCheck
33180 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f  ->errMsg, 1, zFo
33190 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
331a0 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70  end(ap);.  if( p
331b0 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61  Check->errMsg.ma
331c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
331d0 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63    pCheck->malloc
331e0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
331f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
33200 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
33210 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
33220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33230 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
33240 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74  /*.** Add 1 to t
33250 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
33260 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67  nt for page iPag
33270 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  e.  If this is t
33280 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66  he second.** ref
33290 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
332a0 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72  ge, add an error
332b0 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65   message to pChe
332c0 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20  ck->zErrMsg..** 
332d0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
332e0 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65  e are 2 ore more
332f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
33300 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66  he page and 0 if
33310 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
33320 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e  he first referen
33330 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a  ce to the page..
33340 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b  **.** Also check
33350 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
33360 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e  umber is in boun
33370 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
33380 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67  t checkRef(Integ
33390 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
333a0 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20  int iPage, char 
333b0 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66  *zContext){.  if
333c0 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
333d0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61  urn 1;.  if( iPa
333e0 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65  ge>pCheck->nPage
333f0 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20   || iPage<0 ){. 
33400 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33410 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
33420 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67  xt, "invalid pag
33430 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50  e number %d", iP
33440 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
33450 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   1;.  }.  if( pC
33460 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
33470 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65  e]==1 ){.    che
33480 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
33490 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32  ck, zContext, "2
334a0 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
334b0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
334c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
334d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70    }.  return  (p
334e0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
334f0 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66  ge]++)>1;.}..#if
33500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33510 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
33520 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
33530 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
33540 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61  inter-map for pa
33550 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74  ge iChild maps t
33560 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65  o .** page iPare
33570 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65  nt, pointer type
33580 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74   ptrType. If not
33590 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f  , append an erro
335a0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20  r message.** to 
335b0 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  pCheck..*/.stati
335c0 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d  c void checkPtrm
335d0 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ap(.  IntegrityC
335e0 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20  k *pCheck,   /* 
335f0 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  Integrity check 
33600 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e  context */.  Pgn
33610 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20  o iChild,       
33620 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67      /* Child pag
33630 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38  e number */.  u8
33640 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
33650 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
33660 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70   pointer map typ
33670 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72  e */.  Pgno iPar
33680 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ent,          /*
33690 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
336a0 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67  r map parent pag
336b0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
336c0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
336d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
336e0 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65  description (use
336f0 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29  d for error msg)
33700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
33710 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70  .  u8 ePtrmapTyp
33720 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  e;.  Pgno iPtrma
33730 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d  pParent;..  rc =
33740 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63   ptrmapGet(pChec
33750 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20  k->pBt, iChild, 
33760 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69  &ePtrmapType, &i
33770 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
33780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33790 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  OK ){.    checkA
337a0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
337b0 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c   zContext, "Fail
337c0 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61  ed to read ptrma
337d0 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c  p key=%d", iChil
337e0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  d);.    return;.
337f0 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d    }..  if( ePtrm
33800 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c  apType!=eType ||
33810 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d   iPtrmapParent!=
33820 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63  iParent ){.    c
33830 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
33840 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
33850 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20  .      "Bad ptr 
33860 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64  map entry key=%d
33870 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64   expected=(%d,%d
33880 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20  ) got=(%d,%d)", 
33890 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65  .      iChild, e
338a0 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65  Type, iParent, e
338b0 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72  PtrmapType, iPtr
338c0 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  mapParent);.  }.
338d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
338e0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
338f0 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c  ity of the freel
33900 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65  ist or of an ove
33910 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e  rflow page list.
33920 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
33930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
33940 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ges on the list 
33950 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  is N..*/.static 
33960 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a  void checkList(.
33970 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
33980 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67  Check,  /* Integ
33990 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f  rity checking co
339a0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
339b0 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20  sFreeList,      
339c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66   /* True for a f
339d0 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20  reelist.  False 
339e0 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  for overflow pag
339f0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
33a00 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
33a10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
33a20 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20   for first page 
33a30 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
33a40 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
33a50 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
33a60 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ed number of pag
33a70 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  es in the list *
33a80 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
33a90 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  xt        /* Con
33aa0 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
33ab0 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  essages */.){.  
33ac0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70  int i;.  int exp
33ad0 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74  ected = N;.  int
33ae0 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b   iFirst = iPage;
33af0 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
33b00 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  0 && pCheck->mxE
33b10 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65  rr ){.    DbPage
33b20 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20   *pOvflPage;.   
33b30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33b40 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69  pOvflData;.    i
33b50 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20  f( iPage<1 ){.  
33b60 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
33b70 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
33b80 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25  ext,.         "%
33b90 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69  d of %d pages mi
33ba0 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66  ssing from overf
33bb0 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e  low list startin
33bc0 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20  g at %d",.      
33bd0 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65      N+1, expecte
33be0 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  d, iFirst);.    
33bf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
33c00 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28     if( checkRef(
33c10 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
33c20 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b  Context) ) break
33c30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
33c40 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b  3PagerGet(pCheck
33c50 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29  ->pPager, (Pgno)
33c60 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67  iPage, &pOvflPag
33c70 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  e) ){.      chec
33c80 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
33c90 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
33ca0 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
33cb0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
33cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
33cd0 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d  .    pOvflData =
33ce0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
33cf0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
33d00 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29  tData(pOvflPage)
33d10 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65  ;.    if( isFree
33d20 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
33d30 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  t n = get4byte(&
33d40 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23  pOvflData[4]);.#
33d50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33d60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
33d70 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
33d80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33d90 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33da0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
33db0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
33dc0 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
33dd0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
33de0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  dif.      if( n>
33df0 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61  pCheck->pBt->usa
33e00 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20  bleSize/4-2 ){. 
33e10 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33e20 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33e30 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
33e40 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61     "freelist lea
33e50 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20  f count too big 
33e60 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  on page %d", iPa
33e70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d  ge);.        N--
33e80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33e90 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
33ea0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
33eb0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
33ec0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
33ed0 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d  pOvflData[8+i*4]
33ee0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
33ef0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33f00 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  M.          if( 
33f10 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
33f20 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
33f30 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
33f40 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ap(pCheck, iFree
33f50 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
33f60 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
33f70 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xt);.          }
33f80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
33f90 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63    checkRef(pChec
33fa0 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43  k, iFreePage, zC
33fb0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
33fc0 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20   }.        N -= 
33fd0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
33fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33ff0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34000 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
34010 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
34020 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
34030 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61  o-vacuum and iPa
34040 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  ge is not the la
34050 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  st.      ** page
34060 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   in this overflo
34070 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68  w list, check th
34080 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  at the pointer-m
34090 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  ap entry for.   
340a0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
340b0 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73  ing page matches
340c0 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f   iPage..      */
340d0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
340e0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
340f0 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20  um && N>0 ){.   
34100 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74       i = get4byt
34110 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
34120 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
34130 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52  p(pCheck, i, PTR
34140 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
34150 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
34160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
34170 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20  endif.    iPage 
34180 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
34190 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
341a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
341b0 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23  flPage);.  }.}.#
341c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
341d0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
341e0 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
341f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
34200 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
34210 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
34220 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
34230 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
34240 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
34250 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
34260 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
34270 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
34280 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
34290 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
342a0 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
342b0 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
342c0 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
342d0 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
342e0 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
342f0 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
34300 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
34310 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
34320 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
34330 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
34340 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b  .**  NO  2.  Mak
34350 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
34360 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
34370 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20  *  NO  3.  Make 
34380 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
34390 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
343a0 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
343b0 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61  ..**  NO  4.  Ma
343c0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
343d0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
343e0 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
343f0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
34400 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
34410 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
34420 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
34430 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
34440 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
34450 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
34460 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
34470 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
34480 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
34490 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
344a0 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
344b0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
344c0 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
344d0 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
344e0 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
344f0 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
34500 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
34510 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
34520 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
34530 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
34540 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
34550 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
34560 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
34570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34580 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
34590 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
345a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
345b0 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
345c0 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
345d0 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
345e0 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
345f0 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
34600 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
34610 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
34620 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
34630 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
34640 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
34650 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
34660 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
34670 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
34680 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
34690 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
346a0 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *hit;..  sqlite3
346b0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
346c0 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
346d0 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
346e0 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
346f0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
34700 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
34710 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
34720 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
34730 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
34740 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
34750 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
34760 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
34770 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
34780 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
34790 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
347a0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
347b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
347c0 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50  (Pgno)iPage, &pP
347d0 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  age, 0))!=0 ){. 
347e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
347f0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
34800 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62  xt,.       "unab
34810 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  le to get the pa
34820 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  ge. error code=%
34830 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74  d", rc);.    ret
34840 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
34850 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
34860 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
34870 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
34880 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
34890 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
348a0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
348b0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
348c0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
348d0 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
348e0 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
348f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
34900 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
34910 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
34920 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
34930 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
34940 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
34950 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
34960 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
34970 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
34980 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
34990 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
349a0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
349b0 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
349c0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
349d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
349e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
349f0 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
34a00 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
34a10 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70        "On tree p
34a20 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
34a30 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
34a40 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
34a50 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
34a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
34a70 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
34a80 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
34a90 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
34aa0 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
34ab0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
34ac0 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
34ad0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69     assert( sz==i
34ae0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
34af0 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e      if( sz>info.
34b00 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
34b10 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20  int nPage = (sz 
34b20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
34b30 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f  usableSize - 5)/
34b40 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  (usableSize - 4)
34b50 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
34b60 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
34b70 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
34b80 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65  erflow]);.#ifnde
34b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34ba0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
34bb0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34bc0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
34bd0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
34be0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
34bf0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50  AP_OVERFLOW1, iP
34c00 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
34c10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
34c20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70       checkList(p
34c30 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76  Check, 0, pgnoOv
34c40 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74  fl, nPage, zCont
34c50 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
34c60 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79   /* Check sanity
34c70 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70   of left child p
34c80 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
34c90 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
34ca0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d   ){.      pgno =
34cb0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
34cc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
34cd0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
34ce0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
34cf0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
34d00 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
34d10 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
34d20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
34d30 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
34d40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
34d50 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54       d2 = checkT
34d60 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70  reePage(pCheck,p
34d70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65  gno,pPage,zConte
34d80 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  xt);.      if( i
34d90 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20  >0 && d2!=depth 
34da0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
34db0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
34dc0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69  , zContext, "Chi
34dd0 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69  ld page depth di
34de0 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d  ffers");.      }
34df0 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64  .      depth = d
34e00 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
34e10 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
34e20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
34e30 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
34e40 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
34e50 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73  ffset+8]);.    s
34e60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34e70 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
34e80 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
34e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ea0 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74    "On page %d at
34eb0 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c   right child: ",
34ec0 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
34ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34ee0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
34ef0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34f00 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74  ){.      checkPt
34f10 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
34f20 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
34f30 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20   iPage, 0);.    
34f40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
34f50 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
34f60 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20  k, pgno, pPage, 
34f70 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  zContext);.  }. 
34f80 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
34f90 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67  complete coverag
34fa0 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20  e of the page.  
34fb0 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  */.  data = pPag
34fc0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
34fd0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
34fe0 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69  et;.  hit = sqli
34ff0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
35000 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
35010 20 20 69 66 28 20 68 69 74 3d 3d 30 20 29 7b 0a    if( hit==0 ){.
35020 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
35030 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
35040 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
35050 74 28 68 69 74 2c 20 30 2c 20 75 73 61 62 6c 65  t(hit, 0, usable
35060 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  Size );.    mems
35070 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
35080 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
35090 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
350a0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
350b0 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
350c0 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
350d0 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
350e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
350f0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
35100 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
35110 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
35120 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
35130 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 31 30     u16 size = 10
35140 32 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  24;.      int j;
35150 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 3d 75  .      if( pc<=u
35160 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
35170 20 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c       size = cell
35180 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
35190 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
351a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 63   }.      if( (pc
351b0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
351c0 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
351d0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
351e0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
351f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
35200 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
35210 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
35220 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
35230 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
35240 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
35250 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
35260 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
35270 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
35280 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
35290 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
352a0 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
352b0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
352c0 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
352d0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
352e0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
352f0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
35300 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
35310 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
35320 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
35330 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
35340 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
35350 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
35360 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
35370 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
35380 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
35390 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
353a0 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
353b0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
353c0 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
353d0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
353e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
353f0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
35400 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
35410 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
35420 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
35430 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
35440 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
35450 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
35460 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
35470 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
35480 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
35490 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
354a0 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
354b0 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
354c0 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
354d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
354e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
354f0 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
35500 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
35510 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
35520 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
35530 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
35540 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
35550 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
35560 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
35570 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
35580 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
35590 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
355a0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
355b0 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  hit);..  release
355c0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
355d0 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d  eturn depth+1;.}
355e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
355f0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
35600 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
35610 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
35620 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
35630 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35640 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74  e does a complet
35650 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67  e check of the g
35660 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e  iven BTree file.
35670 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20    aRoot[] is.** 
35680 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65  an array of page
35690 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65  s numbers were e
356a0 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ach page number 
356b0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
356c0 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20   of.** a table. 
356d0 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75   nRoot is the nu
356e0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
356f0 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  in aRoot..**.** 
35700 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
35710 20 6f 66 20 65 72 72 6f 72 20 73 65 65 6e 20 69   of error seen i
35720 6e 20 2a 70 6e 45 72 72 2e 20 20 45 78 63 65 70  n *pnErr.  Excep
35730 74 20 66 6f 72 20 73 6f 6d 65 20 6d 65 6d 6f 72  t for some memor
35740 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
35750 65 72 72 6f 72 73 2c 20 20 6e 6e 20 65 72 72 6f  errors,  nn erro
35760 72 20 6d 65 73 73 61 67 65 20 69 73 20 68 65 6c  r message is hel
35770 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
35780 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c  ined from.** mal
35790 6c 6f 63 20 69 73 20 72 65 74 75 72 6e 65 64 20  loc is returned 
357a0 69 66 20 2a 70 6e 45 72 72 20 69 73 20 6e 6f 6e  if *pnErr is non
357b0 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70 6e 45 72  -zero.  If *pnEr
357c0 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c 4c 20 69  r==0 then NULL i
357d0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
357e0 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  /.char *sqlite3B
357f0 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
35800 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  ck(.  Btree *p, 
35810 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
35820 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
35830 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20  /.  int *aRoot, 
35840 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
35850 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62   root pages numb
35860 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75  ers for individu
35870 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e  al trees */.  in
35880 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e  t nRoot,    /* N
35890 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
358a0 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20   in aRoot[] */. 
358b0 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f   int mxErr,    /
358c0 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67  * Stop reporting
358d0 20 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68   errors after th
358e0 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74  is many */.  int
358f0 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72   *pnErr    /* Wr
35900 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  ite number of er
35910 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69  rors seen to thi
35920 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b  s variable */.){
35930 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
35940 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74  nRef;.  Integrit
35950 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74  yCk sCheck;.  Bt
35960 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35970 3e 70 42 74 3b 0a 20 20 63 68 61 72 20 7a 45 72  >pBt;.  char zEr
35980 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  r[100];..  sqlit
35990 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
359a0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
359b0 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  db;.  nRef = sql
359c0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
359d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
359e0 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
359f0 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
35a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
35a10 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71  nErr = 1;.    sq
35a20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
35a30 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
35a40 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
35a50 2c 20 22 63 61 6e 6e 6f 74 20 61 63 71 75 69 72  , "cannot acquir
35a60 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  e a read lock on
35a70 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b   the database");
35a80 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42  .  }.  sCheck.pB
35a90 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63  t = pBt;.  sChec
35aa0 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e  k.pPager = pBt->
35ab0 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b  pPager;.  sCheck
35ac0 2e 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  .nPage = pagerPa
35ad0 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70  gecount(sCheck.p
35ae0 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b  Pager);.  sCheck
35af0 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a  .mxErr = mxErr;.
35b00 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20    sCheck.nErr = 
35b10 30 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 61 6c 6c  0;.  sCheck.mall
35b20 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
35b30 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e  *pnErr = 0;.#ifn
35b40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35b50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
35b60 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20   pBt->nTrunc!=0 
35b70 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50  ){.    sCheck.nP
35b80 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  age = pBt->nTrun
35b90 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
35ba0 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
35bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
35bc0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
35bd0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
35be0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
35bf0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
35c00 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
35c10 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
35c20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
35c30 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
35c40 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
35c50 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
35c60 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
35c70 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
35c80 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
35c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
35ca0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
35cb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
35cc0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
35cd0 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
35ce0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
35cf0 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
35d00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
35d10 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
35d20 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
35d30 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
35d40 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  ] = 1;.  }.  sql
35d50 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
35d60 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 2c  (&sCheck.errMsg,
35d70 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66 28 7a 45   zErr, sizeof(zE
35d80 72 72 29 2c 20 32 30 30 30 30 29 3b 0a 0a 20 20  rr), 20000);..  
35d90 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  /* Check the int
35da0 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
35db0 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68  eelist.  */.  ch
35dc0 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c  eckList(&sCheck,
35dd0 20 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42   1, get4byte(&pB
35de0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
35df0 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  [32]),.         
35e00 20 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74     get4byte(&pBt
35e10 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
35e20 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65  36]), "Main free
35e30 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20  list: ");..  /* 
35e40 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61  Check all the ta
35e50 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
35e60 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26  (i=0; i<nRoot &&
35e70 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69   sCheck.mxErr; i
35e80 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f  ++){.    if( aRo
35e90 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  ot[i]==0 ) conti
35ea0 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
35eb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
35ec0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
35ed0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61  >autoVacuum && a
35ee0 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20  Root[i]>1 ){.   
35ef0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26     checkPtrmap(&
35f00 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d  sCheck, aRoot[i]
35f10 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
35f20 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E, 0, 0);.    }.
35f30 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
35f40 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b  TreePage(&sCheck
35f50 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22  , aRoot[i], 0, "
35f60 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f  List of tree roo
35f70 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ts: ");.  }..  /
35f80 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
35f90 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  y page in the fi
35fa0 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  le is referenced
35fb0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
35fc0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
35fd0 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
35fe0 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53  ; i++){.#ifdef S
35ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36000 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43  ACUUM.    if( sC
36010 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
36020 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
36030 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
36040 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
36050 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
36060 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
36070 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
36080 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
36090 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20  to-vacuum, make 
360a0 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63  sure no tables c
360b0 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65  ontain.    ** re
360c0 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e  ferences to poin
360d0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20  ter-map pages.. 
360e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43     */.    if( sC
360f0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
36100 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
36110 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
36120 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61  i)!=i || !pBt->a
36130 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
36140 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
36150 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
36160 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
36170 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
36180 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  }.    if( sCheck
36190 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20  .anRef[i]!=0 && 
361a0 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
361b0 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d  PAGENO(pBt, i)==
361c0 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61  i && pBt->autoVa
361d0 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
361e0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
361f0 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74  Check, 0, "Point
36200 65 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69  er map page %d i
36210 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69  s referenced", i
36220 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
36230 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
36240 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69  ure this analysi
36250 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20  s did not leave 
36260 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65  any unref() page
36270 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42  s.  */.  unlockB
36280 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
36290 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d  );.  if( nRef !=
362a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
362b0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
362c0 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  r) ){.    checkA
362d0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
362e0 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74  , 0, .      "Out
362f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f  standing page co
36300 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64  unt goes from %d
36310 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68   to %d during th
36320 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20  is analysis",.  
36330 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65      nRef, sqlite
36340 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
36350 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20  Bt->pPager).    
36360 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  );.  }..  /* Cle
36370 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72  an  up and repor
36380 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  t errors..  */. 
36390 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
363a0 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ve(p);.  sqlite3
363b0 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52  _free(sCheck.anR
363c0 65 66 29 3b 0a 20 20 69 66 28 20 73 43 68 65 63  ef);.  if( sChec
363d0 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  k.mallocFailed )
363e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  {.    sqlite3Str
363f0 41 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65  AccumReset(&sChe
36400 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  ck.errMsg);.    
36410 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
36420 6e 45 72 72 2b 31 3b 0a 20 20 20 20 72 65 74 75  nErr+1;.    retu
36430 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45  rn 0;.  }.  *pnE
36440 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
36450 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  ;.  if( sCheck.n
36460 45 72 72 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Err==0 ) sqlite3
36470 53 74 72 41 63 63 75 6d 52 65 73 65 74 28 26 73  StrAccumReset(&s
36480 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20  Check.errMsg);. 
36490 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
364a0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73  trAccumFinish(&s
364b0 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d  Check.errMsg);.}
364c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
364d0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
364e0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
364f0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
36500 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
36510 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
36520 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
36530 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e   The pager filen
36540 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
36550 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
36560 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
36570 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
36580 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
36590 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
365a0 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
365b0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
365c0 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65  GetFilename(Btre
365d0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
365e0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
365f0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
36600 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
36610 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
36620 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
36630 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
36640 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
36650 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
36660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36670 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
36680 67 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ger directory na
36690 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
366a0 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
366b0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
366c0 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
366d0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
366e0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
366f0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
36700 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
36710 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20  etDirname(Btree 
36720 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
36730 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
36740 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
36750 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
36760 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
36770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
36780 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
36790 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
367a0 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
367b0 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
367c0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
367d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
367e0 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
367f0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
36800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
36810 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
36820 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   or not..**.** T
36830 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c  he pager journal
36840 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
36850 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
36860 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
36870 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
36880 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
36890 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
368a0 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
368b0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
368c0 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
368d0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
368e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
368f0 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
36900 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
36910 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
36920 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
36930 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
36940 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
36950 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
36960 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
36970 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
36980 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
36990 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
369a0 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
369b0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
369c0 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54   size of file pT
369d0 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64  o may be reduced
369e0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
369f0 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  on..** If anythi
36a00 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74  ng goes wrong, t
36a10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
36a20 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20  n pTo is rolled 
36a30 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
36a40 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d  successful, Comm
36a50 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79  itPhaseOne() may
36a60 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54   be called on pT
36a70 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
36a80 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ng. .** The call
36a90 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68  er should finish
36aa0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20   committing the 
36ab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
36ac0 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  To by calling.**
36ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
36ae0 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  mit()..*/.static
36af0 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69   int btreeCopyFi
36b00 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
36b10 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
36b20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36b30 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20  OK;.  Pgno i;.. 
36b40 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b   Pgno nFromPage;
36b50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36b60 66 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d  f pages in pFrom
36b70 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61   */.  Pgno nToPa
36b80 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ge;       /* Num
36b90 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
36ba0 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e  pTo */.  Pgno nN
36bb0 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20  ewPage;      /* 
36bc0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
36bd0 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65  in pTo after the
36be0 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f   copy */..  Pgno
36bf0 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   iSkip;         
36c00 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20  /* Pending byte 
36c10 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  page in pTo */. 
36c20 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65   int nToPageSize
36c30 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ;    /* Page siz
36c40 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65  e of pTo in byte
36c50 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d  s */.  int nFrom
36c60 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61  PageSize;  /* Pa
36c70 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d  ge size of pFrom
36c80 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
36c90 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
36ca0 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
36cb0 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
36cc0 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
36cd0 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
36ce0 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e  >db;.  pBtFrom->
36cf0 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a  db = pFrom->db;.
36d00 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d  .  nToPageSize =
36d10 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65   pBtTo->pageSize
36d20 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  ;.  nFromPageSiz
36d30 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67  e = pBtFrom->pag
36d40 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54  eSize;..  if( pT
36d50 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
36d60 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
36d70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
36d80 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
36d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
36da0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
36db0 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  To->pCursor ){. 
36dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36dd0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54  _BUSY;.  }..  nT
36de0 6f 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  oPage = pagerPag
36df0 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50  ecount(pBtTo->pP
36e00 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61  ager);.  nFromPa
36e10 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
36e20 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  unt(pBtFrom->pPa
36e30 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20  ger);.  iSkip = 
36e40 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
36e50 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20  E(pBtTo);..  /* 
36e60 56 61 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67  Variable nNewPag
36e70 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
36e80 6f 66 20 70 61 67 65 73 20 72 65 71 75 69 72 65  of pages require
36e90 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20  d to store the. 
36ea0 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   ** contents of 
36eb0 70 46 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20  pFrom using the 
36ec0 63 75 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a  current page-siz
36ed0 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20  e of pTo..  */. 
36ee0 20 6e 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36   nNewPage = ((i6
36ef0 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69  4)nFromPage * (i
36f00 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  64)nFromPageSize
36f10 20 2b 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53   + (i64)nToPageS
36f20 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20  ize - 1) / .    
36f30 20 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69    (i64)nToPageSi
36f40 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ze;..  for(i=1; 
36f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36f60 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20   (i<=nToPage || 
36f70 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b  i<=nNewPage); i+
36f80 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72  +){..    /* Jour
36f90 6e 61 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nal the original
36fa0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   page..    **.  
36fb0 20 20 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68    ** iSkip is th
36fc0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
36fd0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
36fe0 65 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e (PENDING_BYTE_
36ff0 50 41 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20  PAGE).    ** in 
37000 64 61 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62  database *pTo (b
37010 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e  efore the copy).
37020 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e 65   This page is ne
37030 76 65 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20  ver written .   
37040 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75   ** into the jou
37050 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73  rnal file. Unles
37060 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68  s i==iSkip or th
37070 65 20 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20  e page was not. 
37080 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e     ** present in
37090 20 70 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20   pTo before the 
370a0 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20  copy operation, 
370b0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66  journal page i f
370c0 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a  rom pTo..    */.
370d0 20 20 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70      if( i!=iSkip
370e0 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29   && i<=nToPage )
370f0 7b 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a  {.      DbPage *
37100 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  pDbPage = 0;.   
37110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37120 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
37130 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
37140 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
37150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37160 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37170 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37180 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
37190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
371a0 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67  OK && i>nFromPag
371b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
371c0 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d  * Yeah.  It seem
371d0 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20  s wierd to call 
371e0 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68  DontWrite() righ
371f0 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e  t after Write().
37200 20 42 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a   But.          *
37210 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
37220 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
37230 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
37240 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
37250 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
37260 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79  resent what they
37270 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65   do.  Write() re
37280 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20  ally means "put 
37290 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65  this page in the
372a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
372b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
372c0 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69  nd mark it as di
372d0 72 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  rty so that it w
372e0 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20  ill be written. 
372f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74           ** to t
37300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37310 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72   later."  DontWr
37320 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65  ite() undoes the
37330 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a   second part of.
37340 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
37350 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74  t and prevents t
37360 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  he page from bei
37370 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ng written to th
37380 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a  e database. The.
37390 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
373a0 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  e is still on th
373b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
373c0 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64  al, though.  And
373d0 20 74 68 61 74 20 69 73 20 74 68 65 20 0a 20 20   that is the .  
373e0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65          ** whole
373f0 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62   point of this b
37400 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67  lock: to put pag
37410 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
37420 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ck journal. .   
37430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37450 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
37460 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
37470 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
37480 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
37490 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
374a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
374b0 72 77 72 69 74 65 20 74 68 65 20 64 61 74 61 20  rwrite the data 
374c0 69 6e 20 70 61 67 65 20 69 20 6f 66 20 74 68 65  in page i of the
374d0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
374e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
374f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d  SQLITE_OK && i!=
37500 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77  iSkip && i<=nNew
37510 50 61 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44  Page ){..      D
37520 62 50 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d  bPage *pToPage =
37530 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
37540 33 5f 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20  3_int64 iOff;.. 
37550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37560 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d  3PagerGet(pBtTo-
37570 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f  >pPager, i, &pTo
37580 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
375a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
375b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
375c0 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  (pToPage);.     
375d0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20   }..      for(. 
375e0 20 20 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31         iOff=(i-1
375f0 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a  )*nToPageSize; .
37600 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
37610 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a  TE_OK && iOff<i*
37620 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20  nToPageSize; .  
37630 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46        iOff += nF
37640 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20  romPageSize.    
37650 20 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50    ){.        DbP
37660 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d  age *pFromPage =
37670 20 30 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   0;.        Pgno
37680 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e   iFrom = (iOff/n
37690 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b  FromPageSize)+1;
376a0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46  ..        if( iF
376b0 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rom==PENDING_BYT
376c0 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20  E_PAGE(pBtFrom) 
376d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
376e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
376f0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
37700 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
37710 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20  BtFrom->pPager, 
37720 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67  iFrom, &pFromPag
37730 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
37740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37750 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
37760 2a 7a 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61  *zTo = sqlite3Pa
37770 67 65 72 47 65 74 44 61 74 61 28 70 54 6f 50 61  gerGetData(pToPa
37780 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ge);.          c
37790 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c  har *zFrom = sql
377a0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
377b0 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20  (pFromPage);.   
377c0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
377d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
377e0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d   nFromPageSize>=
377f0 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20  nToPageSize ){. 
37800 20 20 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d             zFrom
37810 20 2b 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61   += ((i-1)*nToPa
37820 67 65 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d  geSize - ((iFrom
37830 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a  -1)*nFromPageSiz
37840 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
37850 20 6e 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65   nCopy = nToPage
37860 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
37870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
37880 20 20 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72     zTo += (((iFr
37890 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53  om-1)*nFromPageS
378a0 69 7a 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f  ize) - (i-1)*nTo
378b0 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  PageSize);.     
378c0 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e         nCopy = n
378d0 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20  FromPageSize;.  
378e0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
378f0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c       memcpy(zTo,
37900 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a   zFrom, nCopy);.
37910 09 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
37920 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b  nref(pFromPage);
37930 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37940 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
37950 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  oPage ){.       
37960 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 28 4d   MemPage *p = (M
37970 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
37980 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 54  PagerGetExtra(pT
37990 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  oPage);.        
379a0 70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  p->isInit = 0;. 
379b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
379c0 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65  gerUnref(pToPage
379d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
379e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
379f0 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b 65 64  ings have worked
37a00 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64 61 74   so far, the dat
37a10 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 6e  abase file may n
37a20 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  eed to be .  ** 
37a30 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 63  truncated. The c
37a40 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73 20 74  omplex part is t
37a50 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65 64 20  hat it may need 
37a60 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  to be truncated 
37a70 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65 20 74  to.  ** a size t
37a80 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  hat is not an in
37a90 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
37aa0 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20  f nToPageSize - 
37ab0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
37ac0 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
37ad0 62 79 20 74 68 65 20 70 61 67 65 72 20 61 73 73  by the pager ass
37ae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 42 2d 54  ociated with B-T
37af0 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20  ree pTo..  **.  
37b00 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
37b10 73 61 79 20 74 68 65 20 70 61 67 65 2d 73 69 7a  say the page-siz
37b20 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30 34 38  e of pTo is 2048
37b30 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 6f   bytes and the o
37b40 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75  riginal .  ** nu
37b50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 73  mber of pages is
37b60 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65 29 2e   5 (10 KB file).
37b70 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20 61 20   If pFrom has a 
37b80 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31 30 32  page size of 102
37b90 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20 61 6e  4 .  ** bytes an
37ba0 64 20 39 20 70 61 67 65 73 2c 20 74 68 65 6e 20  d 9 pages, then 
37bb0 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20 74  the file needs t
37bc0 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  o be truncated t
37bd0 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69 66  o 9KB..  */.  if
37be0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37bf0 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72 6f 6d  ){.    if( nFrom
37c00 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50 61 67  PageSize!=nToPag
37c10 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  eSize ){.      s
37c20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
37c30 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
37c40 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70 50 61  rFile(pBtTo->pPa
37c50 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36 34 20  ger);.      i64 
37c60 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e 46 72  iSize = (i64)nFr
37c70 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28 69 36  omPageSize * (i6
37c80 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20 20 20  4)nFromPage;.   
37c90 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20 28 69     i64 iNow = (i
37ca0 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e 4e 65  64)((nToPage>nNe
37cb0 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65 3a 6e  wPage)?nToPage:n
37cc0 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36 34 29  NewPage) * (i64)
37cd0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20  nToPageSize; .  
37ce0 20 20 20 20 69 36 34 20 69 50 65 6e 64 69 6e 67      i64 iPending
37cf0 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49 4e 47   = ((i64)PENDING
37d00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
37d10 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f 50 61  )-1) *(i64)nToPa
37d20 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20 20 20  geSize;.  .     
37d30 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3c 3d   assert( iSize<=
37d40 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20 20 20  iNow );.  .     
37d50 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61 73 65   /* Commit phase
37d60 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65 20 6a   one syncs the j
37d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f  ournal file asso
37d80 63 69 61 74 65 64 20 77 69 74 68 20 70 54 6f 20  ciated with pTo 
37d90 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  .      ** contai
37da0 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ning the origina
37db0 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65 73 20  l data. It does 
37dc0 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64 61 74  not sync the dat
37dd0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
37de0 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66 74 65   ** itself. Afte
37df0 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69 74 20  r doing this it 
37e00 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 4f  is safe to use O
37e10 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e 64 20  sTruncate() and 
37e20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
37e30 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68 65 20  ile APIs on the 
37e40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 69  database file di
37e50 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  rectly..      */
37e60 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 64 62  .      pBtTo->db
37e70 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 20 20   = pTo->db;.    
37e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37e90 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
37ea0 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
37eb0 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20   0, 0, 1);.     
37ec0 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f 77 20   if( iSize<iNow 
37ed0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
37ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37ef0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
37f00 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a 65 29  te(pFile, iSize)
37f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
37f20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74     /* The loop t
37f30 68 61 74 20 63 6f 70 69 65 64 20 64 61 74 61 20  hat copied data 
37f40 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46  from database pF
37f50 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64 20 6e  rom to pTo did n
37f60 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f 70 75  ot.      ** popu
37f70 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  late the locking
37f80 20 70 61 67 65 20 6f 66 20 64 61 74 61 62 61 73   page of databas
37f90 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20 70 61  e pTo. If the pa
37fa0 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  ge-size of.     
37fb0 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73 6d 61   ** pFrom is sma
37fc0 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74 20 6f  ller than that o
37fd0 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65 61 6e  f pTo, this mean
37fe0 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69 6c 6c  s some data will
37ff0 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61  .      ** not ha
38000 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64 2e 20  ve been copied. 
38010 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
38020 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f  ** This block co
38030 70 69 65 73 20 74 68 65 20 6d 69 73 73 69 6e 67  pies the missing
38040 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62   data from datab
38050 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  ase pFrom to pTo
38060 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67   .      ** using
38070 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68 69 73   file APIs. This
38080 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
38090 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 77   at this point w
380a0 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20 20 20  e know that.    
380b0 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20    ** all of the 
380c0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66 72  original data fr
380d0 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65 6e 20  om pTo has been 
380e0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
380f0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
38100 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  l file. At this 
38110 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62  point it would b
38120 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61 6e 79  e safe to do any
38130 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20 20 2a  thing at.      *
38140 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64 61 74  * all to the dat
38150 61 62 61 73 65 20 66 69 6c 65 20 65 78 63 65 70  abase file excep
38160 74 20 74 72 75 6e 63 61 74 65 20 69 74 20 74 6f  t truncate it to
38170 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20 20 20   zero bytes..   
38180 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
38190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
381a0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3c 6e   nFromPageSize<n
381b0 54 6f 50 61 67 65 53 69 7a 65 20 26 26 20 69 53  ToPageSize && iS
381c0 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29 7b 0a 20  ize>iPending){. 
381d0 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 3b         i64 iOff;
381e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a 20 20  .        for(.  
381f0 20 20 20 20 20 20 20 20 69 4f 66 66 3d 69 50 65          iOff=iPe
38200 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20 20 20 20  nding; .        
38210 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
38220 26 26 20 69 4f 66 66 3c 28 69 50 65 6e 64 69 6e  && iOff<(iPendin
38230 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 20  g+nToPageSize); 
38240 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
38250 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  += nFromPageSize
38260 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
38270 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 46        DbPage *pF
38280 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  romPage = 0;.   
38290 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f         Pgno iFro
382a0 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50  m = (iOff/nFromP
382b0 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20 20 0a 20  ageSize)+1;.  . 
382c0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
382d0 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  om==PENDING_BYTE
382e0 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 7c  _PAGE(pBtFrom) |
382f0 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67  | iFrom>nFromPag
38300 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
38310 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
38320 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
38330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38340 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d  PagerGet(pBtFrom
38350 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c  ->pPager, iFrom,
38360 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20   &pFromPage);.  
38370 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
38380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38390 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
383a0 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61  From = sqlite3Pa
383b0 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d  gerGetData(pFrom
383c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
383d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
383e0 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 46  sWrite(pFile, zF
383f0 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69  rom, nFromPageSi
38400 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  ze, iOff);.     
38410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
38420 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61  gerUnref(pFromPa
38430 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.