/ Hex Artifact Content
Login

Artifact bc7d856505b12f903966d1fd87165588ac7a961b:


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 34 32 31 20 32 30 30 37 2f 30  c,v 1.421 2007/0
0190: 39 2f 30 33 20 31 35 3a 31 39 3a 33 35 20 64 72  9/03 15:19:35 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
03a0: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
03b0: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
03c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69   */.#endif....#i
03d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
03e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
03f0: 2a 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69  *.** A flag to i
0400: 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20  ndicate whether 
0410: 6f 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61  or not shared ca
0420: 63 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  che is enabled. 
0430: 20 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74   Also,.** a list
0440: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0450: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0460: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0470: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0480: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0490: 65 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65  e variables have
04a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
04b0: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
04c0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04d0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20  to access these 
04f0: 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20  variables so we 
0500: 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f  make them.** glo
0510: 62 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69  bal for test bui
0520: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  lds..*/.#ifdef S
0530: 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61  QLITE_TEST.BtSha
0540: 72 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72  red *sqlite3Shar
0550: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
0560: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72  .int sqlite3Shar
0570: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0580: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
0590: 20 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74   BtShared *sqlit
05a0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05b0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  t = 0;.static in
05c0: 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  t sqlite3SharedC
05d0: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b  acheEnabled = 0;
05e0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
05f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
0600: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
0610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0620: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0630: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
0640: 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72  disable the shar
0650: 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68  ed pager and sch
0660: 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a  ema features..**
0670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0680: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f   has no effect o
0690: 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
06a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
06b0: 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63  .** The shared c
06c0: 61 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66  ache setting eff
06d0: 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65  ects only future
06e0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
06f0: 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c  ite3_open(), sql
0700: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f  ite3_open16(), o
0710: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
0720: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
0730: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0740: 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62  d_cache(int enab
0750: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68  le){.  sqlite3Sh
0760: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
0770: 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74   = enable;.  ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
0790: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
07a0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
07b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
07c0: 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
07d0: 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43  (Btree*,Pgno,BtC
07e0: 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65  ursor*);...#ifde
07f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0800: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
0810: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0820: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0830: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0840: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0850: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09c0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09d0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09e0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09f0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0a00: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
0a10: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a40: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a50: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a60: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a70: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a80: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a90: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0aa0: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0ab0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0ac0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ad0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ae0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0af0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0b00: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0b10: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b20: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b40: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b50: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b60: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b80: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b90: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0ba0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
0bb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
0bc0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
0bd0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61  no-op if the sha
0be0: 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74  red-cache is not
0bf0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
0c00: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  ( !p->sharable )
0c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0c20: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
0c30: 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69  * This (along wi
0c40: 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20  th lockTable()) 
0c50: 69 73 20 77 68 65 72 65 20 74 68 65 20 52 65 61  is where the Rea
0c60: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0c70: 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20  g is.  ** dealt 
0c80: 77 69 74 68 2e 20 49 66 20 74 68 65 20 63 61 6c  with. If the cal
0c90: 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20  ler is querying 
0ca0: 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  for a read-lock 
0cb0: 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73 0a  and the flag is.
0cc0: 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73 20    ** set, it is 
0cd0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20  unconditionally 
0ce0: 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20 69  granted - even i
0cf0: 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69 74  f there are writ
0d00: 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20  e-locks.  ** on 
0d10: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61 20  the table. If a 
0d20: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65  write-lock is re
0d30: 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65 61  quested, the Rea
0d40: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0d50: 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  g.  ** is not co
0d60: 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20  nsidered..  **. 
0d70: 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20   ** In function 
0d80: 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66 20  lockTable(), if 
0d90: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64  a read-lock is d
0da0: 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20  emanded and the 
0db0: 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d  .  ** ReadUncomm
0dc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0dd0: 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61  t, no entry is a
0de0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b  dded to the lock
0df0: 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74  s list .  ** (Bt
0e00: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20  Shared.pLock).. 
0e10: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d   **.  ** To summ
0e20: 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65  arize: If the Re
0e30: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0e40: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
0e50: 72 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f 0a  read cursors do.
0e60: 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65 20    ** not create 
0e70: 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65  or respect table
0e80: 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b   locks. The lock
0e90: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ing procedure fo
0ea0: 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d  r a .  ** write-
0eb0: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
0ec0: 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
0ed0: 66 28 20 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c  f( .    !p->pSql
0ee0: 69 74 65 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28  ite || .    0==(
0ef0: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67  p->pSqlite->flag
0f00: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0f10: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0f20: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0f30: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0f40: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
0f50: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
0f60: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
0f70: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
0f80: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
0f90: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
0fa0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
0fb0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
0fc0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
0fd0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
0fe0: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
0ff0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
1000: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1010: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
1020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1030: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1040: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1050: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1060: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1070: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1080: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
1090: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
10a0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
10b0: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
10c0: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
10d0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
10e0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
10f0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
1100: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
1110: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
1120: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
1130: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1140: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
1150: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
1160: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
1170: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
1180: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
1190: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
11a0: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
11b0: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
11c0: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
11d0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11e0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
11f0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
1200: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1210: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1220: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1230: 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20  tex(p) );..  /* 
1240: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1250: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1260: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1270: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1280: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
12c0: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
12d0: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
12e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
12f0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1300: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
1310: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
1320: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
1330: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
1340: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1350: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1360: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1370: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1380: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
1390: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
13a0: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
13b0: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
13c0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
13d0: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
13e0: 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74   .    (p->pSqlit
13f0: 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e 70  e) && .    (p->p
1400: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
1410: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1420: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
1430: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
1440: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1450: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1470: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1480: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
1490: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
14a0: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
14b0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
14c0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
14d0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
14e0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
14f0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
1500: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1510: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
1520: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
1530: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
1540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1550: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1560: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1570: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
1580: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
1590: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
15a0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
15b0: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
15c0: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
15d0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
15e0: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
15f0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
1600: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
1610: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1620: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
1630: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1660: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1670: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
1680: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
1690: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
16a0: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16b0: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
16c0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
16d0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
16e0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
16f0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1700: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
1710: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
1720: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
1730: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
1740: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1750: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1760: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1770: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
1780: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
1790: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
17a0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
17b0: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
17c0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
17d0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
17e0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
17f0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
1800: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
1810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1820: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
1830: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1840: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1850: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1860: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1870: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
1880: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
1890: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
18a0: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
18b0: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
18c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
18d0: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
18e0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
18f0: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
1900: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
1910: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
1920: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1930: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1940: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1950: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
1960: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
1970: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
1980: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
1990: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
19a0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 69  = *ppIter;.    i
19b0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
19c0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
19d0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
19e0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
19f0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a10: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1a20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1a30: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
1a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a50: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
1a60: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
1a70: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1a80: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
1a90: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
1aa0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
1ab0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
1ac0: 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  s a mutex on the
1ad0: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
1ae0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1af0: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
1b00: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
1b10: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
1b20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b30: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
1b40: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
1b50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b60: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1b70: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
1b80: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1b90: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1ba0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bc0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1bd0: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1be0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
1bf0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c00: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
1c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1c20: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
1c30: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1c40: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1c50: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1c60: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1c70: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
1c80: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
1c90: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
1ca0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
1cb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1cc0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
1cd0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
1ce0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1cf0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
1d00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d10: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1d20: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
1d30: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1d40: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1d50: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1d60: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
1d70: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
1d80: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
1d90: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20  erflowCache(x). 
1da0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1db0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1dc0: 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  che(x).#endif../
1dd0: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
1de0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1df0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
1e00: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
1e10: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
1e20: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
1e30: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
1e40: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
1e50: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
1e60: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
1e70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
1e80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ea0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
1ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
1ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f10: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1f20: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
1f30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f40: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
1f50: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
1f60: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
1f70: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
1f80: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
1f90: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
1fa0: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
1fb0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
1fc0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
1fd0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
1fe0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
1ff0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
2000: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
2010: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
2020: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
2030: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
2040: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
2050: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
2060: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2070: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70  OK && 0==pCur->p
2080: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
2090: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
20a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
20b0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
20c0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
20d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20e0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
20f0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
2100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2120: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
2130: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
2140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2150: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
2160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2180: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
21a0: 28 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ( !pCur->pPage->
21b0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
21c0: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
21d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
21f0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2200: 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2210: 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   0;.    pCur->eS
2220: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
2230: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
2240: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
2250: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
2260: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2270: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
2280: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
2290: 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20   cursors except 
22a0: 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20  pExcept open on 
22b0: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69  the table .** wi
22c0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
22d0: 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  ot. Usually, thi
22e0: 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  s is called just
22f0: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a   before cursor.*
2300: 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  * pExcept is use
2310: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  d to modify the 
2320: 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65  table (BtreeDele
2330: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
2340: 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ert())..*/.stati
2350: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
2360: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
2370: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
2380: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
2390: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
23a0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
23b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
23d0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
23e0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
23f0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
2400: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
2410: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
2420: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
2430: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
2440: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
2450: 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20  ==iRoot) && .   
2460: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
2470: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2480: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
2490: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
24a0: 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(p);.      if( 
24b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
24c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24d0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
24e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
24f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2500: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
2510: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2520: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2530: 76 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f 72  void clearCursor
2540: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
2550: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
2560: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2570: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2580: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2590: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
25a0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
25b0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
25d0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
25e0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
25f0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
2600: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
2610: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
2620: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
2630: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
2640: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
2650: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
2660: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
2670: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
2680: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
2690: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
26a0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
26b0: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
26c0: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
26d0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
26e0: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
26f0: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
2700: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2710: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
2720: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2730: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
2740: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
2750: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
2760: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
2770: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
2780: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
2790: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
27a0: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
27b0: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
27c0: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
27d0: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69  OR_INVALID..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
27f0: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2800: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2810: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2820: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2830: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2840: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2850: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2860: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2870: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
2880: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2890: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
28a0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28b0: 69 70 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ip;.  }.#ifndef 
28c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
28d0: 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72 2d  BLOB.  if( pCur-
28e0: 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
28f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2900: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
2910: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72 2d  }.#endif.  pCur-
2920: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2930: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
2940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2950: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
2960: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
2970: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2980: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2990: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
29a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
29b0: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
29c0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
29d0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29e0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29f0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2a00: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2a10: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2a30: 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  e restoreOrClear
2a40: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2a50: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
2a60: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2a70: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
2a80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2a90: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2aa0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
2ab0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
2ac0: 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK)..#ifndef S
2ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2ae0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
2af0: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
2b00: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
2b10: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
2b20: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
2b30: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
2b40: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
2b50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2b60: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
2b70: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
2b80: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
2b90: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
2ba0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2bb0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
2bc0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
2bd0: 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65 74  ge, iPtrMap, ret
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2bf0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2c10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
2c20: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
2c30: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
2c40: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
2c50: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
2c60: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
2c70: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
2c80: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
2c90: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
2ca0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2cb0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
2cc0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
2cd0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
2ce0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
2cf0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
2d00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
2d10: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
2d20: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
2d30: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
2d40: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
2d50: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
2d60: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
2d70: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
2d80: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
2d90: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2da0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
2db0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
2dc0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
2dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2de0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
2df0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
2e00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
2e10: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
2e20: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
2e30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
2e40: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
2e50: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
2e60: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
2e70: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
2e80: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
2e90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
2ea0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
2eb0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
2ec0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
2ed0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2ee0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2ef0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f00: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f10: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
2f20: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
2f30: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
2f40: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
2f50: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
2f60: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
2f70: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
2f80: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
2f90: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
2fa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
2fb0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2fc0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
2fd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fe0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ff0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
3000: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
3010: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
3020: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3030: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
3040: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
3050: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
3070: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
3080: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
3090: 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29  OFFSET(pBt, key)
30a0: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
30b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
30c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
30d0: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
30e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
30f0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
3100: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
3110: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
3120: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
3130: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
3140: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
3150: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
3160: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
3170: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
3180: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
31b0: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
31c0: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
31d0: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
31e0: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
31f0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
3200: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
3210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3220: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
3230: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
3240: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
3250: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
3260: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
3270: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
3280: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
3290: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
32a0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
32b0: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
32c0: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
32d0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
32e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
32f0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
3300: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
3310: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
3320: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
3330: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
3340: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
3350: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
3360: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
3370: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
3380: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
3390: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
33a0: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
33b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
33c0: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
33d0: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
33e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
33f0: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
3400: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
3410: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
3420: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
3430: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
3440: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3450: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3460: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3470: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
3480: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
3490: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
34a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
34c0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
34d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
34e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34f0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
3500: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
3510: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
3520: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
3530: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
3540: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73  (pBt, key);.  as
3550: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
3560: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
3570: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
3580: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
3590: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
35a0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
35b0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
35c0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
35d0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
35e0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
35f0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3600: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
3610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3620: 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
3630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
3640: 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
3650: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
3660: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
3670: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
3680: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
3690: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
36a0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
36b0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
36c0: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
36d0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
36e0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
36f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3700: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
3710: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
3720: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3730: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
3740: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ine findCell(pPa
3750: 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28  ge, iCell) \.  (
3760: 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20 2b  (pPage)->aData +
3770: 20 67 65 74 32 62 79 74 65 28 26 28 70 50 61 67   get2byte(&(pPag
3780: 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67 65  e)->aData[(pPage
3790: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
37a0: 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65  (iCell)])).#ifde
37b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75 38  f SQLITE_TEST.u8
37c0: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69   *sqlite3BtreeFi
37d0: 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  ndCell(MemPage *
37e0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
37f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  ){.  assert( iCe
3800: 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll>=0 );.  asser
3810: 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79 74  t( iCell<get2byt
3820: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
3830: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
3840: 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  +3]) );.  return
3850: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3860: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   iCell);.}.#endi
3870: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  f../*.** This a 
3880: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
3890: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42  sion of sqlite3B
38a0: 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74  treeFindCell() t
38b0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
38c0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
38d0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
38e0: 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65  cells.  See inse
38f0: 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  rt.*/.static u8 
3900: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
3910: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
3920: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
3930: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
3940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
3960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
3970: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
3980: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
3990: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
39a0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
39b0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
39c0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
39d0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
39e0: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
39f0: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
3a00: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
3a10: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
3a20: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
3a30: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
3a40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
3a50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
3a60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
3a70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
3a80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
3a90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
3aa0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
3ab0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
3ac0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
3ad0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
3ae0: 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74  function.  sqlit
3af0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3b00: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
3b10: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
3b20: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
3b30: 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65   and sqlite3Btre
3b40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
3b50: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
3b60: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
3b70: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
3b80: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
3b90: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
3ba0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
3bb0: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
3bc0: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
3bd0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71  instead of.** sq
3be0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3bf0: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
3c00: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
3c10: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
3c20: 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
3c30: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3c40: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
3c50: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
3c60: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
3c70: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
3c80: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
3c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3ca0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
3cb0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
3cc0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
3cd0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
3ce0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
3cf0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  .){.  int n;    
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d10: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
3d20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
3d30: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
3d40: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
3d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d60: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
3d70: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
3d80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
3da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
3db0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
3dc0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
3dd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
3de0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
3df0: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
3e00: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
3e10: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
3e20: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
3e30: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
3e40: 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67  ta ){.    n += g
3e50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
3e60: 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29  l[n], &nPayload)
3e70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3e80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d  Payload = 0;.  }
3e90: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20  .  pInfo->nData 
3ea0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66  = nPayload;.  if
3eb0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
3ec0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3ed0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
3ee0: 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e   (u64 *)&pInfo->
3ef0: 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
3f00: 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e      u32 x;.    n
3f10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3f20: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a  &pCell[n], &x);.
3f30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
3f40: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
3f50: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
3f60: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
3f70: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
3f80: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
3f90: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
3fa0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
3fb0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
3fc0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
3fd0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
3fe0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
3ff0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
4000: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
4010: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
4020: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4030: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
4040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
4050: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
4060: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
4070: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
4080: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
4090: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
40a0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
40b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
40c0: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
40d0: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
40e0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
40f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
4100: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
4110: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4120: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4130: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4140: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4150: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4160: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4170: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4180: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4190: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
41a0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
41b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
41c0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
41d0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
41e0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
41f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
4200: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
4210: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4220: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4230: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4240: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4250: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4260: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4270: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4290: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
42a0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
42b0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
42c0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
42d0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
42e0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
42f0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
4300: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
4310: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4320: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4330: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4340: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4350: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4360: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4370: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4380: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4390: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
43a0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
43b0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
43c0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
43d0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
43e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
43f0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
4400: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
4410: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4420: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4430: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4440: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4450: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4460: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4470: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4480: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4490: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
44a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
44b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
44c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
44d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
44e0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
44f0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
4500: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
4510: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4520: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4530: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4540: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4550: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4560: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4570: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4580: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4590: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
45a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
45b0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
45c0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
45d0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
45e0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
45f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4610: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4620: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4630: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4640: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4650: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4660: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4670: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4680: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4690: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
46a0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
46b0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
46c0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
46d0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
46e0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
46f0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4700: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4710: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4720: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4730: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4740: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4750: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4760: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4770: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4780: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4790: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
47a0: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  int cellSize(Mem
47b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
47c0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
47d0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
47e0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
47f0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4800: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4810: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4820: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
4830: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4850: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4860: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4870: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4880: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4890: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
48a0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
48b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
48d0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
48e0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
48f0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4900: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4910: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4920: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4930: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4940: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4950: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4960: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4970: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4980: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4990: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
49a0: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
49b0: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
49c0: 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nfo;.    sqlite3
49d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
49e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
49f0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
4a00: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4a10: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4a20: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4a30: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4a40: 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
4a50: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4a60: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4a70: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4a80: 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
4a90: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
4aa0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
4ab0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4ac0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
4ad0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
4ae0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
4af0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
4b00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4b20: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
4b30: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
4b40: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
4b50: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4b60: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4b70: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4b80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4b90: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4ba0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4bb0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4bc0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4bd0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
4be0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
4bf0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
4c00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c10: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
4c20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4c30: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
4c40: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
4c50: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
4c60: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
4c70: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
4c80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
4c90: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
4ca0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
4cb0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
4cc0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
4cd0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
4ce0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
4cf0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
4d00: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
4d10: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
4d20: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
4d30: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
4d40: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
4d50: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
4d60: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
4d70: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
4d80: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
4d90: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
4da0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4db0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
4dc0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
4dd0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
4de0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4df0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
4e00: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
4e30: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
4e40: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
4e50: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
4e80: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
4e90: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4eb0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
4ec0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
4ed0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4ee0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
4ef0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
4f00: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
4f10: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
4f20: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
4f30: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
4f40: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
4f50: 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
4f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4f70: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
4f80: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
4f90: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4fb0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
4fc0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
4fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
4fe0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
4ff0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
5000: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5010: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
5020: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
5030: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
5040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5050: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5060: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
5080: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5090: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
50a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
50b0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
50c0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
50d0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
50e0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  temp = sqlite3_m
5130: 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42  alloc( pPage->pB
5140: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
5150: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72   if( temp==0 ) r
5160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5170: 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  EM;.  data = pPa
5180: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
5190: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
51a0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
51b0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
51c0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
51d0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
51e0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
51f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5200: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
5210: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
5220: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
5230: 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
5240: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5250: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
5260: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
5270: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62  , usableSize - b
5280: 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61  rk);.  brk = usa
5290: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
52a0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
52b0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
52c0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
52d0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
52e0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
52f0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
5300: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
5310: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
5320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
5330: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5340: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
5350: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
5360: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
5370: 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73  ]);.    brk -= s
5380: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ize;.    memcpy(
5390: 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d  &data[brk], &tem
53a0: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
53b0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
53c0: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73  , brk);.  }.  as
53d0: 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f  sert( brk>=cellO
53e0: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
53f0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
5400: 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a  a[hdr+5], brk);.
5410: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
5420: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
5430: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
5440: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
5450: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
5460: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
5470: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62  data[addr], 0, b
5480: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  rk-addr);.  sqli
5490: 74 65 33 5f 66 72 65 65 28 74 65 6d 70 29 3b 0a  te3_free(temp);.
54a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
54b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
54c0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
54d0: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
54e0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
54f0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
5500: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
5510: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
5520: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
5530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20   allocation. Or 
5540: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  return 0 if ther
5550: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
5560: 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e  free.** space on
5570: 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74   the page to sat
5580: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
5590: 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  ion request..**.
55a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
55b0: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
55c0: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
55d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
55e0: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
55f0: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
5600: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
5610: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
5620: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
5630: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
5640: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
5650: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
5660: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
5670: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
5680: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
5690: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
56a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
56b0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
56c0: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
56d0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
56e0: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
56f0: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
5700: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
5710: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
5720: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
5730: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
5740: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
5750: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5760: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5770: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5780: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
57a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
57b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
57c0: 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ) );.  if( nByte
57d0: 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a  <4 ) nByte = 4;.
57e0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72    if( pPage->nFr
57f0: 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67  ee<nByte || pPag
5800: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
5810: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61   return 0;.  pPa
5820: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79  ge->nFree -= nBy
5830: 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  te;.  hdr = pPag
5840: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20  e->hdrOffset;.. 
5850: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
5860: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
5870: 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  g<60 ){.    /* S
5880: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
5890: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
58a0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
58b0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
58c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71      ** space req
58d0: 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64  uest. */.    add
58e0: 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77  r = hdr+1;.    w
58f0: 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32  hile( (pc = get2
5900: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
5910: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69  ))>0 ){.      si
5920: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
5930: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
5940: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
5950: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
5960: 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b   size<nByte+4 ){
5970: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5980: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
5990: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
59a0: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
59b0: 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69  +7] = nFrag + si
59c0: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
59d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b        return pc;
59e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
59f0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
5a00: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
5a10: 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20  size-nByte);.   
5a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5a30: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5a40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a50: 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
5a60: 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pc;.    }.  }.. 
5a70: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
5a80: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
5a90: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
5aa0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5ab0: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
5ac0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5ad0: 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  a..  */.  top = 
5ae0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5af0: 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20  dr+5]);.  nCell 
5b00: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5b10: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c  [hdr+3]);.  cell
5b20: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
5b30: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
5b40: 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63  ( nFrag>=60 || c
5b50: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5b60: 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74  ell > top - nByt
5b70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66  e ){.    if( def
5b80: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
5b90: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5ba0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5bb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5bc0: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5bd0: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5be0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5bf0: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5c00: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5c10: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5c20: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5c30: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5c40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5c50: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5c60: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5c70: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5c80: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5c90: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5ca0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5cb0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5cc0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5cd0: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5ce0: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5cf0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5d00: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5d10: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5d20: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5d30: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5d40: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5d50: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
5d60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5d70: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
5d80: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5d90: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
5da0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5db0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
5dc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
5dd0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5df0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5e00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5e10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
5e20: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
5e30: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
5e40: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
5e50: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
5e60: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
5e70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5e80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5e90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5ea0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5eb0: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20  );.  if( size<4 
5ec0: 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66  ) size = 4;..#if
5ed0: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
5ee0: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
5ef0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
5f00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
5f10: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
5f20: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
5f30: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
5f40: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
5f50: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
5f60: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
5f70: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
5f80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
5f90: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
5fa0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
5fb0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
5fc0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
5fd0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
5fe0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
5ff0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
6000: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
6010: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
6020: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
6030: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6040: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6050: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
6060: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6070: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
6080: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
6090: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
60a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
60b0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
60c0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
60d0: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
60e0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
60f0: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
6100: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6110: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
6120: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6130: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
6140: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
6150: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
6160: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
6170: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
6180: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
6190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
61a0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
61b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
61c0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
61d0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
61e0: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
61f0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
6200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6210: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6220: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6230: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
6240: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6250: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
6260: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
6270: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
6280: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
6290: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
62a0: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
62b0: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
62c0: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
62d0: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
62e0: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
62f0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
6300: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
6310: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
6320: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
6330: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
6340: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
6350: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6360: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
6370: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
6380: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
6390: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
63a0: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
63b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
63c0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
63d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
63e0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
63f0: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
6400: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
6410: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
6420: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
6430: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
6440: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
6450: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
6460: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
6470: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6480: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
6490: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
64a0: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
64b0: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
64c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
64d0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
64e0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
64f0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
6500: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6510: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
6520: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
6530: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
6540: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6550: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6560: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
6570: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
6580: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
6590: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
65a0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
65b0: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61  c void decodeFla
65c0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
65d0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
65e0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
65f0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
6600: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
6610: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
6620: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
6630: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
6640: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6650: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6660: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6670: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6680: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6690: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
66a0: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
66b0: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
66c0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
66d0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
66e0: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
66f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
6700: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
6710: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
6720: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
6730: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
6740: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
6750: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
6760: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6770: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
6780: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
6790: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
67a0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
67b0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
67c0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
67d0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
67e0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
67f0: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
6800: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6810: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
6820: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
6830: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
6840: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
6850: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
6860: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6870: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
6880: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
6890: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
68a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
68b0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
68c0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
68d0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
68e0: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
68f0: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
6900: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
6910: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
6920: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
6930: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
6940: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
6950: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
6960: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
6970: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
6980: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
6990: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
69b0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
69c0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
69d0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
69e0: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
69f0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
6a00: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
6a10: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
6a20: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
6a30: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
6a40: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
6a50: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
6a60: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
6a70: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
6a80: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
6a90: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
6aa0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
6ab0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6ac0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20  BtreeInitPage(. 
6ad0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6ae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6af0: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
6b00: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
6b10: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
6b20: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
6b30: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
6b40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
6b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6b60: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
6b70: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
6b80: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
6b90: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
6ba0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6bb0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
6bc0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
6bd0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
6be0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
6bf0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
6c00: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
6c20: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
6c30: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
6c40: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
6c50: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
6c60: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
6c70: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
6c80: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
6c90: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
6ca0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
6cb0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
6cc0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
6cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ce0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
6cf0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
6d00: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
6d10: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
6d20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
6d30: 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42  nt area */..  pB
6d40: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6d50: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
6d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d70: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
6d80: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
6d90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6da0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6dc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
6dd0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
6de0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
6df0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6e00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
6e10: 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67  Data == &((unsig
6e20: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29  ned char*)pPage)
6e30: 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  [-pBt->pageSize]
6e40: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
6e50: 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e  >pParent!=pParen
6e60: 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61  t && (pPage->pPa
6e70: 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65  rent!=0 || pPage
6e80: 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20  ->isInit) ){.   
6e90: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70   /* The parent p
6ea0: 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  age should never
6eb0: 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74   change unless t
6ec0: 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  he file is corru
6ed0: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
6ee0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6ef0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
6f00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20  pPage->isInit ) 
6f10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6f20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
6f30: 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61  Parent==0 && pPa
6f40: 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70  rent!=0 ){.    p
6f50: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
6f60: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
6f70: 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
6f80: 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
6f90: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
6fa0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
6fb0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
6fc0: 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  ata;.  decodeFla
6fd0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
6fe0: 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  dr]);.  pPage->n
6ff0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7000: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
7010: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
7020: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
7030: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
7040: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
7050: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
7060: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
7070: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
7080: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
7090: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
70a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
70b0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
70c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
70d0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
70e0: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
70f0: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
7100: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
7110: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
7120: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
7130: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7140: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
7150: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
7160: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
7170: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
7180: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
7190: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
71a0: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
71b0: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
71c0: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
71d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
71e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
71f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
7200: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
7210: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
7220: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
7230: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
7240: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
7250: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
7260: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
7270: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
7280: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
7290: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
72a0: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
72b0: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
72c0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
72d0: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
72e0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
72f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7300: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
7310: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
7320: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
7330: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
7340: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
7350: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
7360: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
7370: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
7380: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
7390: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
73a0: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
73b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
73c0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
73d0: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
73e0: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
73f0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
7400: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
7410: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
7420: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
7430: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
7440: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
7450: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
7460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7470: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
7480: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
7490: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
74a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
74b0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
74c0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
74d0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
74e0: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
74f0: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
7500: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7510: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
7520: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
7530: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
7540: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
7550: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
7560: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
7570: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68  ge->pBt;.  int h
7580: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
7590: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72  ffset;.  int fir
75a0: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
75b0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
75c0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
75d0: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
75e0: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
75f0: 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  &data[pBt->pageS
7600: 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65  ize] == (unsigne
7610: 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b  d char*)pPage );
7620: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7630: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
7640: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
7650: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
7660: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7670: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7680: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
7690: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
76a0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
76b0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  ;.  data[hdr] = 
76c0: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
76d0: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
76e0: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
76f0: 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  0);.  memset(&da
7700: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
7710: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7720: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
7730: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
7740: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
7750: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
7760: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
7770: 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f   - first;.  deco
7780: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
7790: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
77a0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
77b0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
77c0: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
77d0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
77e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
77f0: 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70  dxShift = 0;.  p
7800: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
7810: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
7820: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 1;.}../*.** G
7830: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
7840: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
7850: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
7860: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
7870: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
7880: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
7890: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
78a0: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
78b0: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
78c0: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
78d0: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
78e0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
78f0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
7900: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
7910: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
7920: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
7930: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
7940: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
7950: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
7960: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
7970: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
7980: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
7990: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
79a0: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
79b0: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
79c0: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
79d0: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
79e0: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
79f0: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
7a00: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
7a10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
7a20: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
7a30: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
7a40: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
7a50: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
7a60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a70: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
7a80: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
7a90: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
7aa0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
7ab0: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
7ac0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
7ad0: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
7ae0: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
7af0: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
7b00: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7b10: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7b20: 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  e;.  DbPage *pDb
7b30: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
7b40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7b50: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7b70: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
7b80: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
7b90: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
7ba0: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
7bb0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
7bc0: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d  rn rc;.  pPage =
7bd0: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
7be0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
7bf0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
7c00: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
7c10: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
7c20: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
7c30: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
7c40: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
7c50: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
7c60: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
7c70: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
7c80: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
7c90: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
7ca0: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
7cb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7cc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
7cd0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
7ce0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
7cf0: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
7d00: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
7d10: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
7d20: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
7d30: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
7d40: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
7d50: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
7d60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
7d70: 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  tPage()..*/.stat
7d80: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
7d90: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
7da0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
7db0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
7dc0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
7dd0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
7de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
7df0: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
7e00: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
7e10: 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
7e20: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
7e30: 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   here */.  MemPa
7e40: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
7e50: 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65  /* Parent of the
7e60: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
7e70: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
7e80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7e90: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7ea0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
7eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7ec0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7ed0: 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  T; .  }.  rc = s
7ee0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
7ef0: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
7f00: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7f10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7f20: 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
7f30: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  it==0 ){.    rc 
7f40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
7f50: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20  itPage(*ppPage, 
7f60: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
7f70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7f80: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
7f90: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
7fa0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
7fb0: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
7fc0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  r.** call to sql
7fd0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7ff0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
8000: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8010: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
8020: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8030: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
8040: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
8050: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  );.    assert( &
8060: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
8070: 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
8080: 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63 68  e]==(unsigned ch
8090: 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  ar*)pPage );.   
80a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
80b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
80c0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
80d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
80e0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
80f0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
8100: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8110: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
8120: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
8130: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
8140: 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f  .** reaches zero
8150: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e  .  We need to un
8160: 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74 20  ref the pParent 
8170: 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61  pointer when tha
8180: 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f  t.** happens..*/
8190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
81a0: 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50 61  eDestructor(DbPa
81b0: 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70  ge *pData, int p
81c0: 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50  ageSize){.  MemP
81d0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
81e0: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
81f0: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61  & 7)==0 );.  pPa
8200: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
8210: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
8220: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
8230: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
8240: 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Init==0 || sqlit
8250: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8260: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8270: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
8280: 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  >pParent ){.    
8290: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
82a0: 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
82b0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
82c0: 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50 61  Parent->pBt==pPa
82d0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 70  ge->pBt );.    p
82e0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
82f0: 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
8300: 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  ge(pParent);.  }
8310: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
8320: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44   = 0;.}../*.** D
8330: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
8340: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
8350: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
8360: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
8370: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
8380: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
8390: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
83a0: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
83b0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
83c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
83d0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
83e0: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
83f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
8400: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8410: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
8420: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
8430: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
8440: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
8450: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
8460: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
8470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8480: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
8490: 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70  ge *pData, int p
84a0: 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50  ageSize){.  MemP
84b0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
84c0: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
84d0: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61  & 7)==0 );.  pPa
84e0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
84f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
8500: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69  xtra(pData);.  i
8510: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
8520: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8530: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8540: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
8550: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
8560: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
8570: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8580: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
8590: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
85a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
85b0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
85c0: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
85d0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
85e0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
85f0: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
8600: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
8610: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77  a new database w
8620: 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d  ith a random nam
8630: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
8640: 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d  his randomly nam
8650: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ed.** database f
8660: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
8670: 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ted when sqlite3
8680: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
8690: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46  called..** If zF
86a0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
86b0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
86c0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
86d0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
86e0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
86f0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
8700: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
8710: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8720: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e  BtreeOpen(.  con
8730: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
8740: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
8750: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
8760: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
8770: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
8780: 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20 20  te3 *pSqlite,   
8790: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
87a0: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
87b0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
87c0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
87d0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
87e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
87f0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
8800: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
8810: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
8820: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
8830: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
8840: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
8850: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
8860: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
8870: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
8880: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
8890: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
88a0: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
88b0: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
88c0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Bt = 0;      /* 
88d0: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
88e0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
88f0: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
8900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
8910: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
8920: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
8930: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
8940: 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67  Reserve;.  unsig
8950: 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
8960: 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53  er[100];..  /* S
8970: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
8980: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
8990: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
89a0: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
89b0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
89c0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
89d0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
89e0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
89f0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
8a00: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
8a10: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
8a20: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
8a30: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
8a40: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
8a50: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
8a60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8a70: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
8a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8a90: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
8aa0: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
8ab0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
8ac0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
8ad0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
8ae0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
8af0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
8b00: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
8b10: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
8b20: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
8b30: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
8b40: 20 70 53 71 6c 69 74 65 21 3d 30 20 29 3b 0a 20   pSqlite!=0 );. 
8b50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8b60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 71 6c  _mutex_held(pSql
8b70: 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  ite->mutex) );..
8b80: 20 20 70 56 66 73 20 3d 20 70 53 71 6c 69 74 65    pVfs = pSqlite
8b90: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
8ba0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
8bb0: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
8bc0: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
8bd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8be0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
8bf0: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
8c00: 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74 65  NE;.  p->pSqlite
8c10: 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 23 69 66   = pSqlite;..#if
8c20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8c30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8c40: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
8c50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
8c60: 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
8c70: 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
8c80: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
8c90: 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
8ca0: 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
8cb0: 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
8cc0: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
8cd0: 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
8ce0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 66 6c 61  .  */.  if( (fla
8cf0: 67 73 20 26 20 42 54 52 45 45 5f 50 52 49 56 41  gs & BTREE_PRIVA
8d00: 54 45 29 3d 3d 30 0a 20 20 20 26 26 20 69 73 4d  TE)==0.   && isM
8d10: 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 28 70  emdb==0.   && (p
8d20: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 26 20  Sqlite->flags & 
8d30: 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a  SQLITE_Vtab)==0.
8d40: 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20     && zFilename 
8d50: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a  && zFilename[0].
8d60: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c    ){.    if( sql
8d70: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
8d80: 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  nabled ){.      
8d90: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
8da0: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ame = (char *)sq
8db0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66  lite3_malloc(pVf
8dc0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a  s->mxPathname);.
8dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
8de0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
8df0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
8e00: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ble = 1;.      i
8e10: 66 28 20 70 53 71 6c 69 74 65 20 29 7b 0a 20 20  f( pSqlite ){.  
8e20: 20 20 20 20 20 20 70 53 71 6c 69 74 65 2d 3e 66        pSqlite->f
8e30: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
8e40: 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20  haredCache;.    
8e50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a    }.      if( !z
8e60: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
8e70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8e80: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
8e90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8ea0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
8eb0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
8ec0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
8ed0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
8ee0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
8ef0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
8f00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
8f10: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
8f20: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
8f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
8f40: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
8f50: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f  hared);.      fo
8f60: 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68 61  r(pBt=sqlite3Sha
8f70: 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70 42  redCacheList; pB
8f80: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
8f90: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
8fa0: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
8fb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
8fc0: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
8fd0: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
8fe0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
8ff0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
9000: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
9010: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
9020: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
9030: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  s ){.          p
9040: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
9050: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
9060: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
9070: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9090: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
90a0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
90b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
90c0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
90d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
90e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
90f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
9100: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
9110: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
9120: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
9130: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
9140: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
9150: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
9160: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
9170: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
9180: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
9190: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
91a0: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
91b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
91c0: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
91d0: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
91e0: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
91f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9200: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9210: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9220: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
9230: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
9240: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
9250: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
9260: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
9270: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
9280: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
9290: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
92a0: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
92b0: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
92c0: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
92d0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
92e0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
92f0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
9300: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
9310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9320: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
9330: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
9340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9350: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
9360: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
9370: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9380: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
9390: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
93a0: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
93b0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
93c0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
93d0: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
93e0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
93f0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
9400: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
9410: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9420: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
9430: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
9440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9450: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
9460: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
9470: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
9480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9490: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
94a0: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
94b0: 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  sFlags);.    if(
94c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
94d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
94e0: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
94f0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
9500: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
9510: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
9520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9540: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
9550: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
9560: 7d 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  }.    p->pBt = p
9570: 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74  Bt;.  .    sqlit
9580: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
9590: 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ctor(pBt->pPager
95a0: 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  , pageDestructor
95b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
95c0: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70  gerSetReiniter(p
95d0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
95e0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74  Reinit);.    pBt
95f0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
9600: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
9610: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
9620: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
9630: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
9640: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
9650: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
9660: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
9670: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
9680: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
9690: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
96a0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
96b0: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
96c0: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
96d0: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
96e0: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
96f0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
9700: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ze = 0;.      sq
9710: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9720: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
9730: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
9740: 65 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d  e);.      pBt->m
9750: 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 36 34  axEmbedFrac = 64
9760: 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20  ;   /* 25% */.  
9770: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
9780: 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a  dFrac = 32;   /*
9790: 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 20 20   12.5% */.      
97a0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
97b0: 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e   = 32;    /* 12.
97c0: 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  5% */.#ifndef SQ
97d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
97e0: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
97f0: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
9800: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
9810: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
9820: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
9830: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
9840: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
9850: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
9860: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
9870: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
9880: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
9890: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
98a0: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
98b0: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
98c0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
98d0: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
98e0: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
98f0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
9900: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
9910: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
9920: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
9930: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
9940: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
9950: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
9960: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
9970: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
9980: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
9990: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
99a0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
99b0: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
99c0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
99d0: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
99e0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
99f0: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
9a00: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
9a10: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
9a20: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
9a30: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
9a40: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
9a50: 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d        pBt->maxEm
9a60: 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61  bedFrac = zDbHea
9a70: 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 20 20 70  der[21];.      p
9a80: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
9a90: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d   = zDbHeader[22]
9aa0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9ab0: 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65  LeafFrac = zDbHe
9ac0: 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 20 20  ader[23];.      
9ad0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
9ae0: 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
9af0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9b00: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
9b10: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
9b20: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
9b30: 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
9b40: 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
9b50: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
9b60: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
9b70: 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
9b80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
9b90: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
9ba0: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
9bb0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
9bc0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
9bd0: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
9be0: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
9bf0: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
9c00: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  geSize */.    sq
9c10: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9c20: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
9c30: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
9c40: 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66  e);.   .#if !def
9c50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9c60: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9c70: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9c80: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
9c90: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
9ca0: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
9cb0: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
9cc0: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
9cd0: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
9ce0: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
9cf0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
9d00: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
9d10: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
9d20: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
9d30: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
9d40: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
9d50: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
9d60: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
9d70: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  );.      pBt->mu
9d80: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
9d90: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
9da0: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
9db0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
9dc0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
9dd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9de0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 53 71 6c  EM;.        pSql
9df0: 69 74 65 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  ite->mallocFaile
9e00: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  d = 0;.        g
9e10: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
9e20: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
9e30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9e40: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
9e50: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
9e60: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 53 68  Next = sqlite3Sh
9e70: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20  aredCacheList;. 
9e80: 20 20 20 20 20 73 71 6c 69 74 65 33 53 68 61 72       sqlite3Shar
9e90: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42  edCacheList = pB
9ea0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9eb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
9ec0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
9ed0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
9ee0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9ef0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
9f00: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
9f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
9f20: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
9f30: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
9f40: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
9f50: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
9f60: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
9f70: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
9f80: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
9f90: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
9fa0: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
9fb0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
9fc0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
9fd0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
9fe0: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
9ff0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
a000: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
a010: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
a020: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
a030: 71 6c 69 74 65 2d 3e 6e 44 62 3b 20 69 2b 2b 29  qlite->nDb; i++)
a040: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
a050: 62 20 3d 20 70 53 71 6c 69 74 65 2d 3e 61 44 62  b = pSqlite->aDb
a060: 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
a070: 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
a080: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
a090: 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
a0a0: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
a0b0: 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
a0c0: 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
a0d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
a0e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
a0f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
a100: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
a110: 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
a120: 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
a130: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
a140: 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
a150: 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
a160: 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
a170: 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
a180: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
a190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a1a0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
a1b0: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
a1c0: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
a1d0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
a1e0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
a200: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
a210: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a220: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
a230: 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
a240: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
a250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a260: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
a270: 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
a280: 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
a290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a2a0: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
a2b0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
a2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
a2d0: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
a2e0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
a2f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
a300: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a310: 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
a320: 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tree = 0;.  }.  
a330: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a340: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
a350: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
a360: 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
a370: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
a380: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
a390: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
a3a0: 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
a3b0: 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
a3c0: 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
a3d0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
a3e0: 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
a3f0: 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
a400: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
a410: 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
a420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
a430: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
a440: 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
a450: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a460: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
a470: 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
a480: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
a490: 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
a4a0: 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
a4b0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
a4c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
a4d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
a4e0: 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
a4f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
a500: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a510: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
a520: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a530: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
a540: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
a550: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
a560: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
a570: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a580: 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  List==pBt ){.   
a590: 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64     sqlite3Shared
a5a0: 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 2d  CacheList = pBt-
a5b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
a5c0: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
a5d0: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
a5e0: 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 77  cheList;.      w
a5f0: 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 70  hile( pList && p
a600: 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
a610: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
a620: 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
a630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a640: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
a650: 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
a660: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
a670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
a690: 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
a6a0: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
a6b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
a6c0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
a6d0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
a6e0: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
a6f0: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
a700: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
a710: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
a720: 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
a730: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
a740: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
a750: 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
a760: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
a770: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
a780: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
a790: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
a7a0: 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
a7b0: 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
a7c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a7d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
a7e0: 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
a7f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
a800: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
a810: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
a820: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
a830: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
a840: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
a850: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
a860: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
a870: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
a880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a890: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
a8a0: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
a8b0: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
a8c0: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
a8d0: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
a8e0: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
a8f0: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
a900: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
a910: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
a920: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
a930: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
a940: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
a950: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
a960: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
a970: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
a980: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
a990: 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
a9a0: 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
a9b0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
a9c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
a9d0: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
a9e0: 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
a9f0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
aa00: 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
aa10: 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
aa20: 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
aa30: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
aa40: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
aa50: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
aa60: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
aa70: 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
aa80: 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
aa90: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
aaa0: 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
aab0: 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
aac0: 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
aad0: 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
aae0: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
aaf0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
ab00: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
ab10: 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
ab20: 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
ab30: 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
ab40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
ab50: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
ab60: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
ab70: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
ab80: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
ab90: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
aba0: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
abb0: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
abc0: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
abd0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
abe0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
abf0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
ac00: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
ac10: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
ac20: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ac30: 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
ac40: 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
ac50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ac60: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
ac70: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
ac80: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
ac90: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
aca0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
acb0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
acc0: 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
acd0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ace0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
acf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ad00: 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73 79   Change the busy
ad10: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
ad20: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  k function..*/.i
ad30: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
ad40: 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74  etBusyHandler(Bt
ad50: 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64  ree *p, BusyHand
ad60: 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a  ler *pHandler){.
ad70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ad80: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
ad90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ada0: 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
adb0: 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  e->mutex) );.  s
adc0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
add0: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73  (p);.  pBt->pBus
ade0: 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64  yHandler = pHand
adf0: 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ler;.  sqlite3Pa
ae00: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
ae10: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
ae20: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 73 71 6c 69  Handler);.  sqli
ae30: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ae40: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ae50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ae60: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
ae70: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
ae80: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
ae90: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
aea0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
aeb0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
aec0: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
aed0: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
aee0: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
aef0: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
af00: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
af10: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
af20: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
af30: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
af40: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
af50: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
af60: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
af70: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
af80: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
af90: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
afa0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
afb0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
afc0: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
afd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
afe0: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
aff0: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
b000: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
b010: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
b020: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
b030: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
b040: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
b050: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
b060: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b070: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
b080: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
b090: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
b0a0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
b0b0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
b0c0: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
b0d0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
b0e0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
b0f0: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
b100: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
b110: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b120: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
b130: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
b140: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
b150: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
b160: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b170: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
b180: 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
b190: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
b1a0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
b1b0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
b1c0: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
b1d0: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
b1e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
b1f0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
b200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b210: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
b220: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
b230: 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
b240: 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
b250: 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
b260: 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
b270: 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
b280: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
b290: 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
b2a0: 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
b2b0: 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
b2c0: 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
b2d0: 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
b2e0: 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
b2f0: 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
b300: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
b310: 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
b320: 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
b330: 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
b340: 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
b350: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
b360: 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
b370: 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
b380: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b390: 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
b3a0: 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
b3b0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
b3c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
b3d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
b3e0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
b3f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
b400: 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65  afetyLevel(Btree
b410: 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20   *p, int level, 
b420: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
b430: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b440: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
b450: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b460: 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  _held(p->pSqlite
b470: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
b480: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
b490: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
b4a0: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
b4b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
b4c0: 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a  vel, fullSync);.
b4d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b4e0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
b4f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
b500: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
b510: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
b520: 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65  iven btree is se
b530: 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65  t to safety leve
b540: 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a  l 1.  In other.*
b550: 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  * words, return 
b560: 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28  TRUE if no sync(
b570: 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  ) occurs on the 
b580: 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  disk files..*/.i
b590: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
b5a0: 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65  yncDisabled(Btre
b5b0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
b5c0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
b5d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
b5e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b5f0: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69  ex_held(p->pSqli
b600: 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  te->mutex) );  .
b610: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
b620: 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
b630: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
b640: 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
b650: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
b660: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
b670: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b680: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
b690: 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
b6a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b6b0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
b6c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
b6d0: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
b6e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b6f0: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
b700: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
b710: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
b720: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
b730: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
b740: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
b750: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
b760: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
b770: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
b780: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
b790: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
b7a0: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
b7b0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
b7c0: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
b7d0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
b7e0: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
b7f0: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
b800: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
b810: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
b820: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b830: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
b840: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
b850: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
b860: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
b870: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
b880: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
b890: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
b8a0: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
b8b0: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
b8c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
b8d0: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
b8e0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
b8f0: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
b900: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
b910: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
b920: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
b930: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b940: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
b950: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
b960: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
b970: 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
b980: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b990: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b9a0: 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
b9b0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b9c0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
b9d0: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
b9e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
b9f0: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
ba00: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
ba10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
ba20: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
ba30: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
ba40: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
ba50: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
ba60: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
ba70: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
ba80: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
ba90: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
baa0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
bab0: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
bac0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
bad0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
bae0: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
baf0: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
bb00: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
bb10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
bb20: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
bb30: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
bb40: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
bb50: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
bb60: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
bb70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
bb80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
bb90: 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69  nReserve;.  sqli
bba0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bbb0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
bbc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bbd0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
bbe0: 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
bbf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
bc00: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
bc10: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
bc20: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
bc30: 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ze;.}.int sqlite
bc40: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
bc50: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
bc60: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
bc70: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
bc80: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
bc90: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
bca0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
bcb0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bcc0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
bcd0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
bce0: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
bcf0: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
bd00: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
bd10: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
bd20: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
bd30: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
bd40: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
bd50: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
bd60: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
bd70: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
bd80: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
bd90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
bda0: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
bdb0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
bdc0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
bdd0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
bde0: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
bdf0: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
be00: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
be10: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
be20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
be30: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
be40: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
be50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
be60: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
be70: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
be80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
be90: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
bea0: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
beb0: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
bec0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
bed0: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
bee0: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
bef0: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
bf00: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
bf10: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
bf20: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
bf30: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
bf40: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
bf50: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
bf60: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
bf70: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
bf80: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
bf90: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
bfa0: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
bfb0: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
bfc0: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
bfd0: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
bfe0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
bff0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
c000: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c010: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
c020: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c030: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
c040: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c050: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
c060: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20  Vacuum?1:0);..  
c070: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c080: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
c090: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
c0a0: 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56  & av!=pBt->autoV
c0b0: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
c0c0: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
c0d0: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
c0e0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c0f0: 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  = av;.  }.  sqli
c100: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c110: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
c120: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
c130: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
c140: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
c150: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
c160: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
c170: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
c180: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
c190: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
c1a0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
c1b0: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
c1c0: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
c1d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c1e0: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
c1f0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
c200: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
c210: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
c220: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
c230: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
c240: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
c250: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
c260: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
c270: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
c280: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
c290: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
c2a0: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
c2b0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
c2c0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
c2d0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
c2e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
c2f0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
c300: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
c310: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
c320: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
c330: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
c340: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
c350: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
c360: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
c370: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
c380: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
c390: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
c3a0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
c3b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
c3c0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
c3d0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
c3e0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
c3f0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
c400: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
c410: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
c420: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
c430: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
c440: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
c450: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
c460: 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53  .  int rc, pageS
c470: 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ize;.  MemPage *
c480: 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
c490: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c4a0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
c4b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
c4c0: 70 50 61 67 65 31 20 29 20 72 65 74 75 72 6e 20  pPage1 ) return 
c4d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20  SQLITE_OK;.  rc 
c4e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
c4f0: 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
c500: 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
c510: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a   return rc;.  ..
c530: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
c540: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
c550: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
c560: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
c570: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
c580: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
c590: 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49 54   */.  rc = SQLIT
c5a0: 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28 20  E_NOTADB;.  if( 
c5b0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c5c0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
c5d0: 72 29 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  r)>0 ){.    u8 *
c5e0: 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
c5f0: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 6d  aData;.    if( m
c600: 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
c610: 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
c620: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c630: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
c640: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
c650: 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
c660: 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
c670: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
c680: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
c690: 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
c6a0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c6b0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
c6c0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
c6d0: 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
c6e0: 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
c6f0: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
c700: 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
c710: 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
c720: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
c730: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
c740: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
c750: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   7)==0 );.    pB
c760: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
c770: 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
c780: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61  >usableSize = pa
c790: 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
c7a0: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  0];.    if( pBt-
c7b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20  >usableSize<500 
c7c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
c7d0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
c7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
c7f0: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70  maxEmbedFrac = p
c800: 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42  age1[21];.    pB
c810: 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20  t->minEmbedFrac 
c820: 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20  = page1[22];.   
c830: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
c840: 63 20 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23  c = page1[23];.#
c850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c860: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
c870: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
c880: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
c890: 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
c8a0: 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
c8b0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
c8c0: 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
c8d0: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
c8e0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
c8f0: 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
c900: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
c910: 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
c920: 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
c930: 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
c940: 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
c950: 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
c960: 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
c970: 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
c980: 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
c990: 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
c9a0: 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
c9b0: 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
c9c0: 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
c9d0: 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
c9e0: 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
c9f0: 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
ca00: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
ca10: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
ca20: 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
ca30: 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
ca40: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
ca50: 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
ca60: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
ca70: 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
ca80: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
ca90: 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
caa0: 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
cab0: 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ner, a header wh
cac0: 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
cad0: 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
cae0: 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
caf0: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
cb00: 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
cb10: 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
cb20: 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
cb30: 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
cb40: 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  xLocal = (pBt->u
cb50: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
cb60: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f  t->maxEmbedFrac/
cb70: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
cb80: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
cb90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
cba0: 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72  *pBt->minEmbedFr
cbb0: 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
cbc0: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
cbd0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
cbe0: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
cbf0: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
cc00: 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d  eSize-12)*pBt->m
cc10: 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d  inLeafFrac/255 -
cc20: 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   23;.  if( pBt->
cc30: 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61  minLocal>pBt->ma
cc40: 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d  xLocal || pBt->m
cc50: 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20  axLocal<0 ){.   
cc60: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
cc70: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61  _failed;.  }.  a
cc80: 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
cc90: 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
cca0: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
ccb0: 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
ccc0: 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72   pPage1;.  retur
ccd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
cce0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
ccf0: 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
cd00: 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
cd10: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
cd20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cd30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
cd40: 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72  rks like lockBtr
cd50: 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  ee() except that
cd60: 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73   it also invokes
cd70: 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c   the.** busy cal
cd80: 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69  lback if there i
cd90: 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  s lock contentio
cda0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
cdb0: 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
cdc0: 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29  try(Btree *pRef)
cdd0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cde0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
cdf0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
ce00: 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20  oldsMutex(pRef) 
ce10: 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  );.  if( pRef->i
ce20: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
ce30: 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
ce40: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
ce50: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
ce60: 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
ce70: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
ce80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ce90: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
cea0: 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
ceb0: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
cec0: 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
ced0: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
cee0: 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
cef0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
cf00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cf10: 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
cf20: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
cf30: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
cf40: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
cf50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cf60: 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
cf70: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
cf80: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
cf90: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
cfa0: 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
cfb0: 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
cfc0: 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
cfd0: 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
cfe0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
cff0: 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
d000: 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
d010: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
d020: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d030: 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
d040: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
d050: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
d060: 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
d070: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
d080: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
d090: 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
d0a0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
d0b0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
d0c0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
d0d0: 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
d0e0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
d0f0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
d100: 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
d110: 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
d120: 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
d130: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d140: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d150: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
d160: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
d170: 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
d180: 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42  pCursor==0 && pB
d190: 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
d1a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d1b0: 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
d1c0: 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a  ->pPager)>=1 ){.
d1d0: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70        if( pBt->p
d1e0: 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20  Page1->aData==0 
d1f0: 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
d200: 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d  ge *pPage = pBt-
d210: 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20  >pPage1;.       
d220: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
d230: 26 28 28 75 38 2a 29 70 50 61 67 65 29 5b 2d 70  &((u8*)pPage)[-p
d240: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
d250: 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42         pPage->pB
d260: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
d270: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31   pPage->pgno = 1
d280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d290: 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
d2a0: 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  >pPage1);.    }.
d2b0: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
d2c0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  = 0;.    pBt->in
d2d0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Stmt = 0;.  }.}.
d2e0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
d2f0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20  new database by 
d300: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
d310: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
d320: 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73  he.** file..*/.s
d330: 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
d340: 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
d350: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
d360: 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
d370: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
d380: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
d390: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d3a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d3b0: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
d3c0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
d3d0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
d3e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d3f0: 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
d400: 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
d410: 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
d420: 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
d430: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
d440: 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
d450: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
d460: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d470: 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
d480: 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
d490: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
d4a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
d4b0: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
d4c0: 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
d4d0: 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
d4e0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
d4f0: 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
d500: 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
d510: 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d   data[20] = pBt-
d520: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
d530: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
d540: 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d  ata[21] = pBt->m
d550: 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  axEmbedFrac;.  d
d560: 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d  ata[22] = pBt->m
d570: 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  inEmbedFrac;.  d
d580: 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d  ata[23] = pBt->m
d590: 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65  inLeafFrac;.  me
d5a0: 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
d5b0: 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
d5c0: 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
d5d0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
d5e0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
d5f0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
d600: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
d610: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d620: 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
d630: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
d640: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
d650: 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
d660: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
d670: 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
d680: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
d690: 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
d6a0: 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
d6b0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
d6c0: 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
d6d0: 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
d6e0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
d6f0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
d700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d710: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
d720: 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
d730: 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
d740: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
d750: 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
d760: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d770: 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
d780: 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
d790: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
d7a0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
d7b0: 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
d7c0: 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
d7d0: 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
d7e0: 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
d7f0: 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
d800: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
d810: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
d820: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
d830: 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
d840: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
d850: 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
d860: 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
d870: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
d880: 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
d890: 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
d8a0: 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
d8b0: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
d8c0: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
d8d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
d8e0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
d8f0: 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
d900: 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
d910: 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
d920: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
d930: 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
d940: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
d950: 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
d960: 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
d970: 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
d980: 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
d990: 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
d9a0: 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
d9b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
d9c0: 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
d9d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d9e0: 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
d9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
da00: 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
da10: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
da20: 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
da30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
da40: 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
da50: 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
da60: 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
da70: 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
da80: 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
da90: 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
daa0: 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
dab0: 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
dac0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
dad0: 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
dae0: 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
daf0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
db00: 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
db10: 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
db20: 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
db30: 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
db40: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
db50: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
db60: 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
db70: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
db80: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
db90: 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
dba0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
dbb0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
dbc0: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
dbd0: 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
dbe0: 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
dbf0: 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
dc00: 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
dc10: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
dc20: 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
dc30: 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
dc40: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
dc50: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
dc60: 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
dc70: 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
dc80: 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
dc90: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
dca0: 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
dcb0: 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
dcc0: 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
dcd0: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
dce0: 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
dcf0: 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
dd00: 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
dd10: 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
dd20: 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
dd30: 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
dd40: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
dd50: 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
dd60: 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
dd70: 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
dd80: 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
dd90: 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
dda0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ddb0: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
ddc0: 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
ddd0: 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
dde0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ddf0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
de00: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
de10: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
de20: 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
de30: 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
de40: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
de50: 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
de60: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
de70: 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
de80: 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
de90: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
dea0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
deb0: 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
dec0: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
ded0: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
dee0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
def0: 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
df00: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
df10: 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
df20: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
df30: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
df40: 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
df50: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
df60: 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
df70: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
df80: 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
df90: 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
dfa0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dfb0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
dfc0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
dfd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
dfe0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
dff0: 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
e000: 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
e010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
e020: 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
e030: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
e040: 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
e050: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e060: 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
e070: 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
e080: 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  E_BUSY..  */.  i
e090: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
e0a0: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
e0b0: 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  TE && wrflag ){.
e0c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e0d0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  BUSY;.    goto t
e0e0: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e0f0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
e100: 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
e110: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
e120: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
e130: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
e140: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
e150: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
e160: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
e170: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
e180: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
e190: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e1a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e1b0: 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
e1c0: 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
e1d0: 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  , wrflag>1);.   
e1e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e1f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e200: 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
e210: 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
e220: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e230: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
e240: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e250: 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20       if( wrflag 
e260: 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  ) pBt->inStmt = 
e270: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
e280: 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
e290: 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
e2a0: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
e2b0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
e2c0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
e2d0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
e2e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  &&.          sql
e2f0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
e300: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73 79  ndler(pBt->pBusy
e310: 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69  Handler) );..  i
e320: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e330: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
e340: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
e350: 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
e360: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
e370: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
e380: 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
e390: 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
e3a0: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
e3b0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
e3c0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
e3d0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
e3e0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
e3f0: 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
e400: 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
e410: 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  :.  btreeIntegri
e420: 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
e430: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
e440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
e450: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e460: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
e470: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
e480: 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
e490: 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
e4a0: 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
e4b0: 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
e4c0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
e4d0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
e4e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
e4f0: 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
e500: 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
e510: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
e520: 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
e530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
e540: 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
e550: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
e560: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
e590: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
e5a0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e5c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
e5d0: 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
e5e0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
e610: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
e620: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
e630: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
e640: 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
e650: 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
e660: 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
e670: 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
e680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e690: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e6a0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
e6b0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
e6c0: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
e6d0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  e->pParent);.  i
e6e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e6f0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
e700: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
e710: 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
e720: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
e730: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
e740: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
e750: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
e760: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
e770: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
e780: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
e790: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
e7a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e7b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74  {.      goto set
e7c0: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
e7d0: 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
e7e0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
e7f0: 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
e800: 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
e810: 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
e820: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
e830: 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
e840: 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
e850: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
e860: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
e870: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
e880: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
e890: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
e8a0: 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
e8b0: 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
e8c0: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
e8d0: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
e8e0: 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
e8f0: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
e900: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
e910: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
e920: 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  gno);.  }..set_c
e930: 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
e940: 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
e950: 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
e960: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e970: 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
e980: 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20  on pPage, which 
e990: 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
e9a0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
e9b0: 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f  , not an overflo
e9c0: 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20  w.** page, is a 
e9d0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
e9e0: 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68  iFrom. Modify th
e9f0: 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  is pointer so th
ea00: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
ea10: 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  ** iTo. Paramete
ea20: 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
ea30: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
ea40: 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69  inter to be modi
ea50: 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c  fied, as .** fol
ea60: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
ea70: 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
ea80: 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
ea90: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
eaa0: 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
eab0: 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
eac0: 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
ead0: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
eae0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
eaf0: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
eb00: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
eb10: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
eb20: 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
eb40: 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
eb50: 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
eb60: 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
eb70: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
eb80: 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
eb90: 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
eba0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
ebb0: 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
ebe0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
ebf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
ec00: 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
ec10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
ec20: 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
ec30: 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
ec40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ec50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ec60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ec70: 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
ec80: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
ec90: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
eca0: 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
ecb0: 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
ecc0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
ecd0: 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
ece0: 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
ecf0: 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
ed00: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
ed10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ed20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
ed30: 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
ed40: 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
ed50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
ed60: 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
ed70: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
ed80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
ed90: 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71  t nCell;..    sq
eda0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
edb0: 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
edc0: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
edd0: 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
ede0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
edf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
ee00: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
ee10: 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
ee20: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
ee30: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
ee40: 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
ee50: 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73   info;.        s
ee60: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
ee70: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
ee80: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
ee90: 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
eea0: 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
eeb0: 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
eec0: 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
eed0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
eee0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
eef0: 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
ef00: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
ef10: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
ef20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ef30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ef40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ef50: 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
ef60: 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
ef70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
ef80: 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
ef90: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
efa0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
efb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
efc0: 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
efd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
efe0: 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
eff0: 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
f000: 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
f010: 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
f020: 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
f030: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
f040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f050: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
f060: 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
f070: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
f080: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
f090: 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
f0a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
f0b0: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
f0c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
f0d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
f0e0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
f0f0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
f100: 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
f110: 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
f120: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
f130: 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
f140: 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
f150: 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
f160: 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
f170: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
f180: 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
f190: 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
f1a0: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
f1b0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
f1c0: 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
f1d0: 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
f1e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f1f0: 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
f200: 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
f210: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
f220: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
f230: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
f240: 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
f250: 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
f260: 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20 20  no iFreePage    
f270: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
f280: 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
f290: 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a  DbPage to */.){.
f2a0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
f2b0: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
f2c0: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
f2d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
f2e0: 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
f2f0: 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
f300: 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
f310: 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
f320: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
f330: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
f340: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
f350: 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
f360: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
f370: 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
f380: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
f390: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
f3a0: 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
f3b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f3c0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
f3d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
f3e0: 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
f3f0: 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
f400: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
f410: 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74 20  om it's current 
f420: 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
f430: 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
f440: 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
f450: 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
f460: 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
f470: 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
f480: 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
f490: 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
f4a0: 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
f4b0: 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
f4c0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f4d0: 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
f4e0: 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
f4f0: 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  e, iFreePage);. 
f500: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f510: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
f520: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
f530: 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
f540: 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
f550: 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
f560: 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
f570: 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
f580: 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
f590: 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
f5a0: 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
f5b0: 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
f5c0: 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
f5d0: 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
f5e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
f5f0: 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
f600: 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
f610: 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
f620: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
f630: 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
f640: 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
f650: 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
f660: 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
f670: 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
f680: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
f690: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
f6a0: 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
f6b0: 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
f6c0: 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
f6d0: 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
f6e0: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
f6f0: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
f700: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
f710: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
f720: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
f730: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
f740: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f750: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
f770: 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
f780: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
f790: 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
f7a0: 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
f7b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
f7c0: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
f7d0: 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
f7e0: 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
f7f0: 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
f800: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f810: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f820: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
f830: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
f840: 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
f850: 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
f860: 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
f870: 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
f880: 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
f890: 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
f8a0: 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
f8b0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
f8c0: 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
f8d0: 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
f8e0: 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
f8f0: 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
f900: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
f910: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
f920: 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
f930: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
f940: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f950: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f960: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
f970: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
f980: 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
f990: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
f9a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f9b0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
f9c0: 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
f9d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f9e0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
f9f0: 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
fa00: 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
fa10: 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
fa20: 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
fa30: 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
fa40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
fa50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
fa60: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
fa70: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
fa80: 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20  pe, iPtrPage);. 
fa90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
faa0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
fab0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
fac0: 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
fad0: 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
fae0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
faf0: 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
fb00: 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
fb10: 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
fb20: 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
fb30: 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
fb40: 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
fb50: 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
fb60: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
fb70: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
fb80: 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
fb90: 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
fba0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
fbb0: 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
fbc0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
fbd0: 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
fbe0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
fbf0: 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
fc00: 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
fc10: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
fc20: 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
fc30: 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
fc40: 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
fc50: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
fc60: 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
fc70: 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
fc80: 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
fc90: 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
fca0: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
fcb0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
fcc0: 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
fcd0: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
fce0: 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
fcf0: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
fd00: 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
fd10: 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
fd20: 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
fd30: 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
fd40: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
fd50: 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
fd60: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
fd70: 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
fd80: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
fd90: 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
fda0: 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
fdb0: 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
fdc0: 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b  pBt, Pgno nFin){
fdd0: 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b  .  Pgno iLastPg;
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdf0: 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  Last page in the
fe00: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
fe10: 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
fe20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fe30: 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
fe40: 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
fe50: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
fe60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fe70: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
fe80: 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70  );.  iLastPg = p
fe90: 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66  Bt->nTrunc;.  if
fea0: 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a  ( iLastPg==0 ){.
feb0: 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 73 71      iLastPg = sq
fec0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
fed0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
fee0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54  ;.  }..  if( !PT
fef0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
ff00: 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
ff10: 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
ff20: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
ff30: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
ff40: 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
ff50: 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
ff60: 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
ff70: 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
ff80: 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
ff90: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
ffa0: 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69  st==0 || nFin==i
ffb0: 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20  LastPg ){.      
ffc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
ffd0: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
ffe0: 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
fff0: 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
10000 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
10010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10030 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10040 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
10050 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
10060 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10070 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10080 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
10090 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
100a0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
100b0 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
100c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
100d0 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
100e0 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
100f0 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
10100 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
10110 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
10120 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
10130 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
10140 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
10150 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
10160 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
10170 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
10180 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
10190 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
101a0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
101b0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
101c0 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
101d0 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
101e0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
101f0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
10200 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
10210 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
10220 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
10230 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
10240 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
10250 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
10260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
10280 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
10290 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
102a0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
102b0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
102c0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
102d0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
102e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
102f0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
10300 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10310 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
10320 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
10330 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
10340 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
10350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10360 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10370 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
10380 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
10390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
103a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
103b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
103c0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
103d0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
103e0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
103f0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
10400 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
10410 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
10420 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
10430 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
10440 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
10450 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10460 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
10470 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
10480 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
10490 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
104a0 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
104b0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
104c0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
104d0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
104e0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
104f0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
10500 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10510 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
10520 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
10530 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
10540 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
10550 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
10560 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
10570 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10590 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
105a0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
105b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
105c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
105d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
105e0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
105f0 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
10600 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
10610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
10620 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
10630 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
10640 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10650 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
10660 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
10670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10680 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10690 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a  rn rc;.      } .
106a0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
106b0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
106c0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
106d0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b  rPage, iFreePg);
106e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
106f0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
10700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10720 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10730 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   } .    }.  }.. 
10740 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69   pBt->nTrunc = i
10750 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68  LastPg - 1;.  wh
10760 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ile( pBt->nTrunc
10770 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
10780 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50  AGE(pBt)||PTRMAP
10790 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
107a0 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20  ->nTrunc) ){.   
107b0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a   pBt->nTrunc--;.
107c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
107d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
107e0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
107f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
10800 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
10810 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
10820 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
10830 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
10840 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
10850 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
10860 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
10870 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
10880 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
10890 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
108a0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
108b0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
108c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
108d0 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
108e0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
108f0 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  ccured,.** SQLIT
10900 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
10910 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
10920 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
10930 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
10940 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
10950 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
10960 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
10970 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10980 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10990 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
109a0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
109b0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
109c0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
109d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
109e0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
109f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
10a00 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
10a10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10a20 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
10a30 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
10a40 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
10a50 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a  umStep(pBt, 0);.
10a60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
10a70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10a90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10aa0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
10ab0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
10ac0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
10ad0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
10ae0 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
10af0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
10b00 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
10b10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10b20 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
10b30 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
10b40 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
10b50 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10b60 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
10b70 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
10b80 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
10b90 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
10ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
10bb0 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
10bc0 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
10bd0 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
10be0 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
10bf0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
10c00 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
10c10 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
10c20 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75  pBt, Pgno *pnTru
10c30 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
10c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
10c50 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
10c60 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65  ->pPager;.#ifnde
10c70 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  f NDEBUG.  int n
10c80 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
10c90 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
10ca0 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  r);.#endif..  as
10cb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10cc0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10cd0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
10ce0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
10cf0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
10d00 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
10d10 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
10d20 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
10d30 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
10d40 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d  0;..    if( pBt-
10d50 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20  >nTrunc==0 ){.  
10d60 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a      Pgno nFree;.
10d70 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d        Pgno nPtrm
10d80 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ap;.      const 
10d90 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
10da0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
10db0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73 71 6c  Pgno nOrig = sql
10dc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
10dd0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
10de0 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  ..      if( PTRM
10df0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
10e00 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20  Orig) ){.       
10e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10e20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
10e30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
10e40 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
10e50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
10e60 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b          nOrig--;
10e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
10e80 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
10e90 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
10ea0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20  ata[36]);.      
10eb0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
10ec0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
10ed0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
10ee0 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
10ef0 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20  );.      nFin = 
10f00 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
10f10 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69  nPtrmap;.      i
10f20 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
10f30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
10f40 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
10f50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
10f60 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d  ){.        nFin-
10f70 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
10f80 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
10f90 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
10fa0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
10fb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
10fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
10fd0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10fe0 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
10ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11000 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
11010 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
11020 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
11030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
11040 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  NE ){.      asse
11050 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42  rt(nFin==0 || pB
11060 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20  t->nTrunc==0 || 
11070 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e  nFin<=pBt->nTrun
11080 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  c);.      rc = S
11090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
110a0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
110b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
110c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
110d0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
110e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
110f0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11100 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
11110 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11120 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
11130 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
11140 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
11150 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b  ->nTrunc = nFin;
11160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11170 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11190 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
111a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
111b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
111c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
111d0 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74    *pnTrunc = pBt
111e0 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42  ->nTrunc;.    pB
111f0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  t->nTrunc = 0;. 
11200 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
11210 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
11220 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
11230 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11240 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  }..#endif../*.**
11250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
11260 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
11270 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
11280 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
11290 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
112a0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
112b0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
112c0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
112d0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
112e0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
112f0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
11300 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
11310 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
11320 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
11330 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
11340 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11350 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11360 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
11370 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
11380 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
11390 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
113a0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
113b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
113c0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
113d0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
113e0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
113f0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
11400 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
11410 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
11420 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
11430 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
11440 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
11450 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
11460 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
11470 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
11480 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
11490 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
114a0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
114b0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
114c0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
114d0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
114e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
114f0 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  it() for the sec
11500 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
11510 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
11520 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
11530 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
11540 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
11550 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
11560 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
11570 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
11580 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
11590 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
115a0 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
115b0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
115c0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
115d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
115e0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
115f0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
11600 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
11610 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
11620 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
11630 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
11640 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
11650 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
11660 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
11670 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
11680 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
11690 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
116a0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
116b0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
116c0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
116d0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
116e0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
116f0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
11700 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
11710 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
11720 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
11730 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
11740 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
11750 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11760 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
11770 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
11780 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
11790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
117a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
117b0 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
117c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
117d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
117e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
117f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
11800 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
11810 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11820 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
11830 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
11840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11850 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
11860 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11870 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
11880 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
11890 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
118a0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c  acuumCommit(pBt,
118b0 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20   &nTrunc); .    
118c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
118d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
118e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
118f0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
11900 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
11910 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11920 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11930 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
11940 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
11950 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
11960 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11970 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
11980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11990 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
119a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
119b0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
119c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
119d0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
119e0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
119f0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
11a00 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
11a10 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
11a20 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
11a30 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
11a40 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
11a50 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
11a60 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
11a70 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
11a80 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
11a90 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
11aa0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
11ab0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
11ac0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
11ad0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
11ae0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
11af0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
11b00 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
11b10 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
11b20 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
11b30 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
11b40 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
11b50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11b60 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
11b70 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
11b80 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
11b90 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
11ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
11bb0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
11bc0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
11bd0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
11be0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
11bf0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
11c00 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
11c10 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
11c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11c30 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
11c40 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
11c50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11c60 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
11c70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11c80 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
11c90 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
11ca0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
11cb0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
11cc0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
11cd0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
11ce0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
11cf0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
11d00 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
11d10 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
11d20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
11d30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
11d40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
11d50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
11d60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11d70 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
11d80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
11d90 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
11da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11db0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
11dc0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
11dd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11df0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11e00 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
11e10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
11e20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
11e30 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
11e40 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
11e50 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c  t = 0;.  }.  unl
11e60 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
11e70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
11e80 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
11e90 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
11ea0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
11eb0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11ec0 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
11ed0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
11ee0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
11ef0 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
11f00 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
11f10 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
11f20 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
11f30 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
11f40 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
11f50 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
11f60 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
11f70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
11f80 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
11f90 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   ){.    pBt->nTr
11fa0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
11fb0 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
11fc0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
11fd0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
11fe0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
11ff0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
12000 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64   /* Set the hand
12010 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e  les current tran
12020 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
12030 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
12040 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20  unlock.  ** the 
12050 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
12060 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
12070 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
12080 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12090 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  */.  p->inTrans 
120a0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
120b0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
120c0 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
120d0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
120e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
120f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12110 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
12120 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
12130 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12140 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
12150 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
12160 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12170 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
12180 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
12190 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
121a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
121b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
121c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
121d0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
121e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
121f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12200 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
12210 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
12220 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12230 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
12240 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
12250 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
12260 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
12270 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
12280 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
12290 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
122a0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
122b0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
122c0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
122d0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
122e0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
122f0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
12300 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
12310 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
12320 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
12330 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
12340 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
12350 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
12360 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
12370 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
12380 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
12390 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
123a0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
123b0 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
123c0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
123d0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
123e0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
123f0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
12400 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
12410 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
12420 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
12430 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
12440 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
12450 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
12460 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
12470 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
12480 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
12490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
124a0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
124b0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
124c0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
124d0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
124e0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
124f0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
12500 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
12510 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
12520 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
12530 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
12540 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
12550 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
12560 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12570 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
12580 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
12590 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
125a0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
125b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
125c0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
125d0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
125e0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
125f0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
12600 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
12610 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
12620 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
12630 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
12640 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
12650 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
12660 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
12670 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
12680 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
12690 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
126a0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
126b0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
126c0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
126d0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
126e0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
126f0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
12700 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
12710 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
12720 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
12730 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
12740 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
12750 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12760 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
12770 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
12780 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
12790 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6c 65 61  pNext){.    clea
127a0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
127b0 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74  p);.    p->eStat
127c0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
127d0 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20  ;.    p->skip = 
127e0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73  errCode;.  }.  s
127f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12800 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
12810 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
12820 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
12830 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
12840 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
12850 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
12860 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
12870 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
12880 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
12890 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
128a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
128b0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
128c0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
128d0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
128e0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
128f0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
12900 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12910 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
12920 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
12930 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
12940 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
12950 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
12960 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
12970 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
12980 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
12990 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
129a0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
129b0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
129c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
129d0 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  );.  rc = saveAl
129e0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
129f0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
12a00 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12a10 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
12a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12a30 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
12a40 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
12a50 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
12a60 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65  c() error occure
12a70 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
12a80 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
12a90 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
12aa0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
12ab0 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
12ac0 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
12ad0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
12ae0 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
12af0 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
12b00 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
12b10 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
12b20 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
12b30 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
12b40 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
12b50 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
12b60 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
12b70 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
12b80 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
12b90 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
12ba0 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
12bb0 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
12bc0 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
12bd0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
12be0 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
12bf0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12c00 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
12c10 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
12c20 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
12c30 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75  ntegrity(p);.  u
12c40 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70  nlockAllTables(p
12c50 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
12c60 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
12c70 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
12c80 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
12c90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12ca0 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  M.    pBt->nTrun
12cb0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
12cc0 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
12cd0 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
12ce0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
12cf0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
12d00 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
12d10 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
12d20 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
12d30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
12d40 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
12d50 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
12d60 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
12d70 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
12d80 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
12d90 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69      ** call sqli
12da0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
12db0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
12dc0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
12dd0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
12de0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
12df0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
12e00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12e10 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
12e20 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
12e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
12e40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
12e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12e60 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
12e70 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
12e80 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
12e90 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
12ea0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  READ;.  }..  if(
12eb0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
12ec0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61  NS_NONE ){.    a
12ed0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
12ee0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
12ef0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
12f00 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30  ion--;.    if( 0
12f10 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
12f20 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
12f30 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
12f40 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
12f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e    }.  }..  p->in
12f60 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
12f70 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  NE;.  pBt->inStm
12f80 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42  t = 0;.  unlockB
12f90 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
12fa0 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
12fb0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
12fc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12fe0 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
12ff0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13000 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75  saction.  The su
13010 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
13020 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
13030 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  d back independe
13040 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
13050 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
13060 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
13070 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
13080 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
13090 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  subtransaction..
130a0 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  ** The subtransa
130b0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
130c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20  utomatically if 
130d0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
130e0 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20  tion.** commits 
130f0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
13100 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75  *.** Only one su
13110 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79  btransaction may
13120 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20   be active at a 
13130 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20  time.  It is an 
13140 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20  error to try.** 
13150 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
13160 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  ubtransaction if
13170 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e   another subtran
13180 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
13190 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  dy active..**.**
131a0 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
131b0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
131c0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
131d0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
131e0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
131f0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
13200 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
13210 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
13220 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
13230 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
13240 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
13250 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
13260 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
13270 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
13280 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
13290 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
132a0 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
132b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
132c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
132d0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
132e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
132f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13300 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
13310 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13320 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73   if( (p->inTrans
13330 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c  !=TRANS_WRITE) |
13340 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  | pBt->inStmt ){
13350 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
13360 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
13370 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
13380 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
13390 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
133a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
133b0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
133c0 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  ;.    rc = pBt->
133d0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
133e0 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61  E_OK : sqlite3Pa
133f0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74  gerStmtBegin(pBt
13400 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
13410 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  Bt->inStmt = 1;.
13420 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
13430 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
13450 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74  ** Commit the st
13460 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  atment subtransa
13470 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
13480 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66  in progress.  If
13490 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61   no.** subtransa
134a0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
134b0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
134c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
134d0 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28  BtreeCommitStmt(
134e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
134f0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
13500 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13510 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13520 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
13530 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
13540 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
13550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13560 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42  gerStmtCommit(pB
13570 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
13580 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
13590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
135a0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
135b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
135c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
135d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
135e0 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  llback the activ
135f0 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  e statement subt
13600 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
13610 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  no subtransactio
13620 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74  n.** is active t
13630 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13640 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c   no-op..**.** Al
13650 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
13660 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  e invalidated by
13670 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
13680 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a    Any attempt.**
13690 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
136a0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
136b0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
136c0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
136d0 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74  n.** will result
136e0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   in an error..*/
136f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13700 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74  eRollbackStmt(Bt
13710 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13730 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13740 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
13750 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13760 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  .  sqlite3Malloc
13770 44 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 69 66  Disallow();.  if
13780 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
13790 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
137a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
137b0 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
137c0 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
137d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
137e0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
137f0 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
13800 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
13810 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61  .  }.  sqlite3Ma
13820 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b 0a 20 20 73  llocAllow();.  s
13830 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13840 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  ;.}../*.** Defau
13860 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f  lt key compariso
13870 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  n function to be
13880 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70   used if no comp
13890 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a  arison function.
138a0 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ** is specified 
138b0 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  on the sqlite3Bt
138c0 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c  reeCursor() call
138d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
138e0 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76  dfltCompare(.  v
138f0 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  oid *NotUsed,   
13900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
13910 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73  r data is not us
13920 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20  ed */.  int n1, 
13930 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20  const void *p1, 
13940 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20     /* First key 
13950 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
13960 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f  int n2, const vo
13970 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65  id *p2     /* Se
13980 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70  cond key to comp
13990 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  are */.){.  int 
139a0 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28  c;.  c = memcmp(
139b0 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20  p1, p2, n1<n2 ? 
139c0 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20  n1 : n2);.  if( 
139d0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
139e0 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72  n1 - n2;.  }.  r
139f0 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
13a00 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
13a10 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
13a20 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
13a30 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
13a40 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
13a50 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
13a60 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
13a70 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
13a80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13a90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
13aa0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
13ab0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
13ac0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
13ad0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
13ae0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
13af0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
13b00 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
13b10 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
13b20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
13b30 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
13b40 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
13b50 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
13b60 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
13b70 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
13b80 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
13b90 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
13ba0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
13bb0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
13bc0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
13bd0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
13be0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
13bf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13c00 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
13c10 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
13c20 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
13c30 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
13c40 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
13c50 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
13c60 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
13c70 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
13c80 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
13c90 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
13ca0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
13cb0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
13cc0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
13cd0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
13ce0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
13cf0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
13d00 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
13d10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13d20 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
13d30 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
13d40 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
13d50 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
13d60 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
13d70 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
13d80 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
13d90 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
13da0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
13db0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
13dc0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
13dd0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
13de0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
13df0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
13e00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
13e10 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
13e20 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
13e30 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ctly..**.** The 
13e40 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
13e50 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69  ion must be logi
13e60 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  cally the same f
13e70 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a  or every cursor.
13e80 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ** on a particul
13e90 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67  ar table.  Chang
13ea0 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ing the comparis
13eb0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  on function will
13ec0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e   result.** in in
13ed0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
13ee0 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70  ns.  If the comp
13ef0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
13f00 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65  is NULL, a.** de
13f10 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e  fault comparison
13f20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
13f30 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73  d.  The comparis
13f40 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  on function is.*
13f50 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64  * always ignored
13f60 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   for INTKEY tabl
13f70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
13f80 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
13f90 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fc0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
13fd0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
14000 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
14010 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
14020 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
14050 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
14060 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  only */.  int (*
14070 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xCmp)(void*,int,
14080 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
14090 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a  const void*), /*
140a0 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20   Key Comparison 
140b0 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  func */.  void *
140c0 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
140f0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
14100 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
14110 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20 20  *ppCur          
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
14140 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
14150 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
14160 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42  ursor *pCur;.  B
14170 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14180 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
14190 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
141a0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
141b0 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69   *ppCur = 0;.  i
141c0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
141d0 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
141e0 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ly ){.      retu
141f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
14200 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
14210 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
14220 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29  (p, iTable, 0) )
14230 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14240 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
14250 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
14260 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
14270 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74  .    rc = lockBt
14280 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b  reeWithRetry(p);
14290 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
142a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
142b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
142c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
142d0 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67  adOnly && wrFlag
142e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
142f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
14310 75 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ur = sqlite3Mall
14320 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
14330 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
14340 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Cur==0 ){.    rc
14350 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14360 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
14370 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
14380 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70  n;.  }.  pCur->p
14390 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
143a0 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54  iTable;.  if( iT
143b0 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74  able==1 && sqlit
143c0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
143d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30  (pBt->pPager)==0
143e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
143f0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67  ITE_EMPTY;.    g
14400 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
14410 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
14420 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
14430 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
14440 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
14450 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  r->pPage, 0);.  
14460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14470 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
14480 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
14490 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
144a0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
144b0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
144c0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
144d0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
144e0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
144f0 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  es, link the cur
14500 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
14510 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73  hared list and s
14520 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20  et *ppCur (the. 
14530 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d   ** output argum
14540 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
14550 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43  tion)..  */.  pC
14560 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78  ur->xCompare = x
14570 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c  Cmp ? xCmp : dfl
14580 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72  tCompare;.  pCur
14590 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ->pArg = pArg;. 
145a0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
145b0 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
145c0 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
145d0 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20  Flag = wrFlag;. 
145e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
145f0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
14600 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
14610 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
14620 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
14630 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
14640 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
14650 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
14660 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a  SOR_INVALID;.  *
14670 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20  ppCur = pCur;.. 
14680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14690 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
146a0 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69  r_exception:.  i
146b0 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72  f( pCur ){.    r
146c0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
146d0 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  >pPage);.    sql
146e0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
146f0 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  .  }.  unlockBtr
14700 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
14710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14720 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14730 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
14740 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
14770 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
14780 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
147b0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
147c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
147d0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14800 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14810 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76  .  int (*xCmp)(v
14820 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
14830 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
14840 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f  oid*), /* Key Co
14850 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
14860 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20  .  void *pArg,  
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14890 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
148a0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
148b0 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20  tCursor **ppCur 
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
148e0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
148f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
14900 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
14910 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
14920 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
14930 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
14940 2c 20 78 43 6d 70 2c 20 70 41 72 67 2c 20 70 70  , xCmp, pArg, pp
14950 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
14960 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
14980 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
14990 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
149a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
149b0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
149c0 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
149d0 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
149e0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
149f0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
14a00 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
14a10 2a 70 43 75 72 29 7b 0a 20 20 42 74 53 68 61 72  *pCur){.  BtShar
14a20 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
14a30 70 42 74 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  pBt;.  Btree *pB
14a40 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
14a50 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ree;..  sqlite3B
14a60 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
14a70 29 3b 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  );.  clearCursor
14a80 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
14a90 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
14aa0 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  v ){.    pCur->p
14ab0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
14ac0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ur->pNext;.  }el
14ad0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  se{.    pBt->pCu
14ae0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
14af0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  xt;.  }.  if( pC
14b00 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
14b10 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
14b20 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
14b30 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  v;.  }.  release
14b40 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
14b50 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
14b60 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
14b70 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
14b80 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
14b90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14ba0 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
14bb0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
14bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14bd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14be0 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
14bf0 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
14c00 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
14c10 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
14c20 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
14c30 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
14c40 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
14c50 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
14c60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
14c70 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
14c80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
14c90 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
14ca0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
14cb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
14cc0 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63  (pCur) );.  memc
14cd0 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75  py(pTempCur, pCu
14ce0 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29  r, sizeof(*pCur)
14cf0 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70  );.  pTempCur->p
14d00 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d  Next = 0;.  pTem
14d10 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b  pCur->pPrev = 0;
14d20 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d  .  if( pTempCur-
14d30 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71  >pPage ){.    sq
14d40 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54  lite3PagerRef(pT
14d50 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70  empCur->pPage->p
14d60 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
14d70 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
14d80 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
14d90 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
14da0 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
14db0 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
14dc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
14dd0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
14de0 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
14df0 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
14e00 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
14e10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
14e20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
14e30 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  if( pCur->pPage 
14e40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
14e50 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70  gerUnref(pCur->p
14e60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
14e70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
14e80 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
14e90 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
14ea0 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
14eb0 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
14ec0 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
14ed0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
14ee0 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
14ef0 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42  call.** sqlite3B
14f00 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
14f10 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
14f20 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
14f30 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
14f40 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
14f50 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
14f60 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
14f70 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
14f80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
14f90 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
14fa0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
14fb0 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
14fc0 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
14fd0 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
14fe0 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
14ff0 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
15000 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
15010 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
15020 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
15030 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
15040 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
15050 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
15060 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
15070 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
15080 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
15090 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
150a0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
150b0 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
150c0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
150d0 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
150e0 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
150f0 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
15100 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
15110 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
15120 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
15130 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
15140 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
15150 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
15160 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
15170 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
15180 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15190 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
151a0 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
151b0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
151c0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c  (info));.    sql
151d0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
151e0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
151f0 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f  pCur->idx, &info
15200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
15210 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
15220 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
15230 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
15240 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
15250 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
15260 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
15270 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
15280 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
15290 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
152a0 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
152b0 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
152c0 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
152d0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
152e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
152f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
15300 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
15310 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
15320 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
15330 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
15340 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  x, &pCur->info);
15350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15360 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
15370 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
15380 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
15390 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
153a0 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
153b0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
153c0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
153d0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
153e0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
153f0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
15400 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
15440 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15470 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
15480 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15490 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
154a0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
154b0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20  pCur->info);    
154c0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15510 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
15520 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
15560 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
15570 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
15580 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
15590 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
155a0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
155b0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
155c0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
155d0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
155e0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
155f0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
15600 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
15610 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
15620 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
15630 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
15640 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
15650 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
15660 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
15670 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
15680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15690 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
156a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
156b0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
156c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
156d0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
156e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
156f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
15700 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
15710 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
15720 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
15730 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
15750 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
15760 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
15770 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
15780 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
15790 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
157a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
157b0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
157c0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
157d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
157e0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
157f0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
15800 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
15810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15830 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
15840 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15850 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
15860 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
15870 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
15880 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
15890 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
158a0 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
158b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
158c0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
158d0 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
158e0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
158f0 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
15900 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
15910 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
15920 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
15930 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
15940 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
15950 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15960 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
15970 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
15980 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
15990 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
159a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
159b0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
159c0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
159d0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
159e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
159f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
15a00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
15a10 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
15a20 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
15a30 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
15a40 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
15a50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15a60 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
15a70 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
15a80 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
15a90 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
15aa0 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
15ab0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
15ac0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
15ad0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
15ae0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
15af0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
15b00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15b10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
15b20 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
15b30 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
15b40 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
15b50 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
15b60 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
15b70 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
15b80 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
15b90 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
15ba0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
15bb0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
15bc0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
15bd0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
15be0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
15bf0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
15c00 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
15c10 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
15c20 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
15c30 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
15c40 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15c50 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
15c60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
15c70 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
15c80 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  e:.**.** Unless 
15c90 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c  pPgnoNext is NUL
15ca0 4c 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  L, the page numb
15cb0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
15cc0 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
15cd0 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
15ce0 69 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  ist is written t
15cf0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
15d00 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73   page ovfl.** is
15d10 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
15d20 6e 20 69 74 27 73 20 6c 69 6e 6b 65 64 20 6c 69  n it's linked li
15d30 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
15d40 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
15d50 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
15d60 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70  is not NULL, *pp
15d70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74  Page is set to t
15d80 68 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64  he MemPage* hand
15d90 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f  le.** for page o
15da0 76 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79  vfl. The underly
15db0 69 6e 67 20 70 61 67 65 72 20 70 61 67 65 20 6d  ing pager page m
15dc0 61 79 20 68 61 76 65 20 62 65 65 6e 20 72 65 71  ay have been req
15dd0 75 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  uested.** with t
15de0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
15df0 67 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61  g set, so the pa
15e00 67 65 20 64 61 74 61 20 61 63 63 65 73 73 61 62  ge data accessab
15e10 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68  le via.** this h
15e20 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65  andle may not be
15e30 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   trusted..*/.sta
15e40 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
15e50 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
15e60 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e  red *pBt, .  Pgn
15e70 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
15e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65            /* Ove
15e90 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20  rflow page */.  
15ea0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
15eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15ec0 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
15ed0 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  dle */.  Pgno *p
15ee0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
15ef0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
15f00 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
15f10 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
15f20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
15f30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
15f40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15f50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
15f60 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f  x) );.  /* One o
15f70 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74  f these must not
15f80 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77   be NULL. Otherw
15f90 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68  ise, why call th
15fa0 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a  is function? */.
15fb0 20 20 61 73 73 65 72 74 28 70 70 50 61 67 65 20    assert(ppPage 
15fc0 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  || pPgnoNext);..
15fd0 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78    /* If pPgnoNex
15fe0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
15ff0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
16000 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f   being called to
16010 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d   obtain.  ** a M
16020 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63  emPage* referenc
16030 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d  e only. No page-
16040 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
16050 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
16060 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f   */.  if( !pPgno
16070 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Next ){.    retu
16080 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  rn sqlite3BtreeG
16090 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
160a0 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
160b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
160c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
160d0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
160e0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
160f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
16100 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
16110 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
16120 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
16130 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
16140 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
16150 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
16160 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
16170 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
16180 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
16190 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
161a0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
161b0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
161c0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
161d0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
161e0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
161f0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
16200 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
16210 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
16220 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
16230 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
16240 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
16250 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
16260 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
16270 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
16280 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
16290 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
162a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
162b0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
162c0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71    if( iGuess<=sq
162d0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
162e0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
162f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
16300 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
16310 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
16320 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
16330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16340 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16350 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16360 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16370 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
16380 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
16390 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
163a0 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uess;.      }.  
163b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
163c0 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c    if( next==0 ||
163d0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d   ppPage ){.    M
163e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
163f0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
16400 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16410 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
16420 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20  ge, next!=0);.  
16430 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
16440 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
16450 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
16460 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
16470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
16480 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
16490 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
164a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50    }..    if( ppP
164b0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  age ){.      *pp
164c0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
164d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
164e0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
164f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
16500 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
16510 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
16520 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
16530 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
16540 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
16550 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
16560 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
16570 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
16580 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
16590 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
165a0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
165b0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
165c0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
165d0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
165e0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
165f0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
16600 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
16610 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
16620 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
16630 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
16640 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
16650 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
16660 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
16670 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
16680 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
16690 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
166a0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
166b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
166c0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
166d0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
166e0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
166f0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
16700 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
16710 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
16720 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16730 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
16740 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
16750 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16760 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
16770 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16790 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
167a0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
167b0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
167c0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
167d0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
167e0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
167f0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
16800 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
16810 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
16820 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
16830 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
16840 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
16850 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
16860 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
16870 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
16880 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
16890 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
168a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
168b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
168c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
168d0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
168e0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
168f0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
16900 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
16910 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
16920 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
16930 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
16940 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
16950 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
16960 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16970 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16990 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
169a0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
169b0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
169c0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
169d0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
169e0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
169f0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
16a00 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
16a10 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
16a20 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
16a30 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
16a40 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
16a50 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
16a60 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
16a70 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
16a80 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
16a90 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
16aa0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
16ab0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
16ac0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
16ad0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
16ae0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
16af0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
16b00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16b10 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
16b20 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
16b30 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
16b40 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
16b50 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
16b60 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
16b70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
16b80 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
16b90 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
16ba0 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
16bb0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
16bc0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
16bd0 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
16be0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
16bf0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
16c00 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
16c10 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
16c20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
16c30 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
16c40 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
16c50 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
16c60 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
16c70 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
16c80 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
16c90 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
16ca0 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
16cb0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
16cc0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
16cd0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
16ce0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
16cf0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
16d00 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
16d10 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
16d20 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
16d30 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
16d40 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
16d50 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
16d60 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
16d70 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
16d80 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
16d90 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
16da0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
16db0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
16dc0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
16dd0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
16de0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
16df0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
16e00 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
16e10 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
16e20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
16e30 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
16e40 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
16e50 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
16e60 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
16e70 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
16e80 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
16e90 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
16ea0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
16eb0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
16ec0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
16ed0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
16ee0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
16ef0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
16f00 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
16f10 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
16f20 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  om */.  int offs
16f30 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
16f40 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
16f50 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
16f60 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  oad */.  int amt
16f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16f80 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
16f90 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
16fa0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
16fb0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
16fc0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
16fd0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
16fe0 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
16ff0 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
17000 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
17010 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
17020 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
17030 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
17040 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
17050 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
17060 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
17070 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
17080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17090 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
170a0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
170b0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
170c0 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  ->pPage;     /* 
170d0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
170e0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
170f0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
17100 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
17110 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72  t;        /* Btr
17120 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
17130 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
17140 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
17150 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
17160 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17170 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
17180 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
17190 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
171a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
171b0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
171c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
171d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
171e0 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
171f0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
17200 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
17210 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
17220 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
17230 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
17240 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
17250 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
17260 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  ;..  if( skipKey
17270 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
17280 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
17290 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
172a0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
172b0 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Data ){.    /* T
172c0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
172d0 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
172e0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
172f0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
17300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17310 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
17320 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
17330 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
17340 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
17350 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
17360 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
17370 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
17380 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
17390 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
173a0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
173b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
173c0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
173d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
173e0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
173f0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
17400 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
17410 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
17420 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
17430 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
17440 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
17450 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
17460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
17470 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
17480 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
17490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
174a0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
174b0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66     const int ovf
174c0 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
174d0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
174e0 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
174f0 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
17500 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
17510 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
17520 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
17530 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
17540 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
17550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17560 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
17570 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
17580 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
17590 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
175a0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
175b0 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
175c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
175d0 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
175e0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
175f0 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
17600 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
17610 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
17620 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
17630 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
17640 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17650 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
17660 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
17670 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
17680 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
17690 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
176a0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
176b0 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
176c0 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
176d0 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
176e0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
176f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
17700 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
17710 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
17720 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
17730 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
17740 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
17750 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
17760 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
17770 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
17780 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
17790 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
177a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
177b0 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
177c0 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vfl);.      if( 
177d0 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e  nOvfl && !pCur->
177e0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
177f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17800 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
17810 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17820 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
17830 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
17840 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
17850 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
17860 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
17870 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
17880 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
17890 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
178a0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
178b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
178c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
178d0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
178e0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
178f0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
17900 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
17910 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
17920 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
17930 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
17940 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
17950 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
17960 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
17970 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
17980 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
17990 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
179a0 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
179b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
179c0 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
179d0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
179e0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
179f0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17a00 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
17a10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17a20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17a30 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
17a40 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
17a50 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
17a60 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
17a70 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
17a80 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
17a90 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
17aa0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
17ab0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
17ac0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
17ad0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
17ae0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
17af0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
17b00 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
17b10 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
17b20 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
17b30 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
17b40 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
17b50 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
17b60 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
17b70 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
17b80 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
17b90 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
17ba0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
17bb0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
17bc0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
17bd0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
17be0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
17bf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
17c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17c10 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
17c20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
17c30 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
17c40 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
17c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
17c60 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
17c70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
17c80 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
17c90 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
17ca0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
17cb0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
17cc0 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
17cd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
17ce0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
17cf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17d00 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
17d10 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
17d20 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
17d30 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
17d40 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
17d50 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
17d60 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
17d70 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
17d80 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
17d90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17da0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
17db0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
17dc0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
17dd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
17de0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
17df0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
17e00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
17e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17e20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
17e30 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
17e40 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
17e50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
17e60 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
17e70 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
17e80 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
17e90 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
17ea0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
17eb0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
17ec0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
17ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
17ee0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
17ef0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
17f00 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
17f10 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
17f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17f30 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
17f40 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
17f50 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
17f60 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
17f70 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
17f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17f90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
17fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17fb0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
17fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17fd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17fe0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17ff0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
18000 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
18010 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
18020 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
18030 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
18040 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
18050 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
18060 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
18070 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
18080 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
18090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
180a0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
180b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
180c0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
180d0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
180e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
180f0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
18100 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
18110 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
18120 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
18130 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
18140 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
18150 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
18160 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
18170 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18180 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18190 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
181a0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
181b0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
181c0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
181d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
181e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
181f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18200 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
18210 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
18220 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
18230 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
18240 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
18250 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18260 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
18270 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18280 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Page->intKey==0 
18290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
182a0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
182b0 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
182c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
182d0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
182e0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
182f0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
18300 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
18310 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18320 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18330 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
18340 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
18350 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18360 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18370 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18380 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18390 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
183a0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
183b0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
183c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
183d0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
183e0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
183f0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
18400 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
18410 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
18420 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
18430 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
18440 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
18450 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18460 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18470 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
18480 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18490 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
184a0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
184b0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
184c0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
184d0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
184e0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
184f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
18500 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
18520 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18530 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18540 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18550 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18560 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18570 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18580 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
18590 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
185a0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
185b0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
185c0 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
185d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
185e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
185f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
18600 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
18610 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
18620 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
18630 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
18640 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
18650 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
18660 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18670 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
18680 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
18690 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
186a0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
186b0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
186c0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
186d0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
186e0 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
186f0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
18700 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
18710 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
18720 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
18730 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
18740 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
18750 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18760 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18770 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
18780 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
18790 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
187a0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
187b0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
187c0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
187d0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
187e0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
187f0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
18800 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
18810 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
18820 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
18830 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
18840 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
18850 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
18860 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
18870 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
18880 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
18890 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
188a0 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74   reassembly.** t
188b0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
188c0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
188d0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
188e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
188f0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
18900 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
18910 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
18920 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
18930 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
18940 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
18950 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
18960 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
18970 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
18980 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18990 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
189a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
189b0 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
189c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
189d0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
189e0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
189f0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
18a00 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
18a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18a20 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
18a30 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
18a40 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
18a50 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
18a60 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
18a70 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
18a80 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
18a90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18aa0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
18ab0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
18ac0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
18ad0 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
18ae0 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
18af0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18b00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18b10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18b20 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
18b30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18b40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
18b50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
18b60 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  e;.  assert( pCu
18b70 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
18b80 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
18b90 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
18ba0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
18bb0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
18bc0 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
18bd0 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
18be0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
18bf0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
18c00 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
18c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
18c20 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
18c30 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
18c40 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
18c50 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
18c60 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
18c70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18c80 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
18c90 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
18ca0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18cb0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
18cc0 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
18cd0 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
18ce0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
18cf0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
18d00 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
18d10 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
18d20 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
18d30 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
18d40 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
18d50 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
18d60 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
18d70 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
18d80 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
18d90 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
18da0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
18db0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
18dc0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
18dd0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
18de0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
18df0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
18e00 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
18e10 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
18e20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
18e30 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
18e40 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
18e50 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
18e60 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
18e70 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
18e80 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
18e90 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
18ea0 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
18eb0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
18ec0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
18ed0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
18ee0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
18ef0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
18f00 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
18f10 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
18f20 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
18f30 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
18f40 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
18f50 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
18f60 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
18f70 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
18f80 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
18f90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
18fa0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
18fb0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
18fc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18fd0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
18fe0 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
18ff0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
19000 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
19010 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19020 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
19030 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
19040 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
19050 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
19060 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19070 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19080 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
19090 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
190a0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
190b0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
190c0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
190d0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
190e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
190f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19100 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
19110 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
19120 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
19130 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
19140 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
19150 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
19160 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
19170 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
19180 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
19190 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
191a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
191b0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
191c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
191d0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
191e0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
191f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
19200 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19210 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
19220 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19230 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19240 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
19250 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
19260 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43  o, &pNewPage, pC
19270 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66  ur->pPage);.  if
19280 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19290 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64  ;.  pNewPage->id
192a0 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  xParent = pCur->
192b0 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20  idx;.  pOldPage 
192c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
192d0 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68   pOldPage->idxSh
192e0 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  ift = 0;.  relea
192f0 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29  sePage(pOldPage)
19300 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
19310 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
19320 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
19330 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
19340 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
19350 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
19360 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19370 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19390 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
193a0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
193b0 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
193c0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
193d0 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  its table..**.**
193e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   The virtual roo
193f0 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f  t page is the ro
19400 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74  ot page for most
19410 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a   tables.  But.**
19420 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72   for the table r
19430 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c  ooted on page 1,
19440 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65   sometime the re
19450 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  al root page.** 
19460 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
19470 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
19480 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20  inter.  In such 
19490 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72  cases the.** vir
194a0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
194b0 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
194c0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
194d0 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69  r of page.** 1 i
194e0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
194f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19500 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  eeIsRootPage(Mem
19510 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
19520 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
19530 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19540 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19550 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
19560 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20  x) );.  pParent 
19570 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
19580 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
19590 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
195a0 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
195b0 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
195c0 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
195d0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
195e0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
195f0 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
19600 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
19610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
19620 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
19630 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
19640 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
19650 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
19660 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
19670 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
19680 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
19690 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
196a0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
196b0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
196c0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
196d0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
196e0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
196f0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
19700 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
19710 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
19720 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
19730 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
19740 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19750 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
19760 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
19770 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
19780 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
19790 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
197a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
197b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
197c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
197d0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
197e0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
197f0 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b  ert( pPage!=0 );
19800 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
19810 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
19820 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
19830 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
19840 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
19850 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
19860 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70  .  idxParent = p
19870 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
19880 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
19890 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
198a0 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
198b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
198c0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
198d0 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
198e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
198f0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
19900 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
19910 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
19920 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
19930 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19940 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
19950 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19960 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
19970 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19980 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
19990 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
199a0 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
199b0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
199c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
199d0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
199e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
199f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19a00 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
19a10 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
19a20 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
19a30 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
19a40 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
19a50 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
19a60 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
19a70 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
19a80 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
19a90 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19aa0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
19ab0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
19ac0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
19ad0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
19ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
19af0 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
19b00 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
19b10 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19b20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
19b30 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
19b40 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
19b50 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
19b60 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
19b70 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
19b80 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
19b90 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
19ba0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
19bb0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
19bc0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
19bd0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
19be0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
19bf0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
19c00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
19c10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19c20 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
19c30 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
19c40 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
19c50 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
19c60 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
19c70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
19c80 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
19c90 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
19ca0 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
19cb0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
19cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
19cd0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
19ce0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
19cf0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
19d00 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
19d10 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
19d20 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
19d30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
19d40 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
19d50 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
19d60 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
19d70 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
19d80 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
19d90 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
19da0 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
19db0 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
19dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
19de0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19df0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
19e00 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
19e10 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
19e20 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
19e30 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
19e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
19e50 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
19e60 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
19e70 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
19e80 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
19e90 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
19ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
19eb0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
19ec0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
19ed0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
19ee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19ef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19f00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
19f10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19f20 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
19f30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19f40 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19f50 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
19f60 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
19f70 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
19f80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
19f90 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
19fa0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
19fb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
19fc0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
19fd0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
19fe0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a  e, pCur->idx));.
19ff0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a000 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1a030 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a040 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
1a050 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1a060 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
1a070 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
1a080 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a090 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
1a0a0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
1a0b0 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
1a0c0 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
1a0d0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
1a0e0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1a0f0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
1a100 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
1a110 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
1a120 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
1a130 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
1a140 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
1a150 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a160 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
1a170 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
1a180 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
1a190 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
1a1a0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
1a1b0 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
1a1c0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a1d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a1e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
1a1f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a200 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1a210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a220 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1a230 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1a240 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a250 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1a260 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a270 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a280 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1a290 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1a2a0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
1a2b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1a2c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1a2d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1a2e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1a2f0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  ;.    pCur->idx 
1a300 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1a310 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a320 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1a340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a350 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1a360 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20  ge->nCell - 1;. 
1a370 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1a380 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ize = 0;.  }.  r
1a390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a3a0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1a3b0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1a3c0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1a3d0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1a3e0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1a3f0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1a400 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1a410 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1a420 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1a430 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1a440 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1a450 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1a460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a470 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1a480 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1a490 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1a4a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a4b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a4c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1a4d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a4e0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
1a4f0 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29  Sqlite->mutex) )
1a500 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1a510 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1a520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a530 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1a540 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1a550 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1a560 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1a570 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1a580 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1a590 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1a5a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1a5b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1a5c0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1a5d0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
1a5e0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1a5f0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1a600 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
1a610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a620 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1a630 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
1a640 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1a650 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1a660 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1a670 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1a680 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1a690 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1a6a0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1a6b0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1a6c0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1a6d0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1a6e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a6f0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
1a700 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1a710 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
1a720 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a730 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1a750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a760 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
1a770 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29  Sqlite->mutex) )
1a780 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1a790 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1a7a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a7b0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
1a7c0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1a7d0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1a7e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1a7f0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1a800 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1a810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a820 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a830 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a840 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
1a850 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1a860 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1a870 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1a880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a890 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1a8a0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1a8b0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1a8c0 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65 79   entry near pKey
1a8d0 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e  /nKey..** Return
1a8e0 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1a8f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1a900 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74  Y tables, only t
1a910 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65  he nKey paramete
1a920 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  r is used.  pKey
1a930 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
1a940 20 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65   For other table
1a950 73 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20 6e  s, nKey is the n
1a960 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1a970 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65  f data.** in pKe
1a980 79 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73  y.  The comparis
1a990 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63  on function spec
1a9a0 69 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 63  ified when the c
1a9b0 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65  ursor was.** cre
1a9c0 61 74 65 64 20 69 73 20 75 73 65 64 20 74 6f 20  ated is used to 
1a9d0 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a  compare keys..**
1a9e0 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
1a9f0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
1aa00 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
1aa10 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
1aa20 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1aa30 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
1aa40 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
1aa50 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
1aa60 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
1aa70 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
1aa80 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
1aa90 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
1aaa0 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
1aab0 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
1aac0 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   The result of c
1aad0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
1aae0 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
1aaf0 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20  to which the.** 
1ab00 63 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65  cursor is writte
1ab10 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52  n to *pRes if pR
1ab20 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d  es!=NULL.  The m
1ab30 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69  eaning of.** thi
1ab40 73 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f  s value is as fo
1ab50 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
1ab60 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
1ab70 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1ab80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1ab90 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1abb0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
1abc0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
1abd0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
1ac00 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
1ac10 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
1ac20 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
1ac30 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
1ac40 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1ac50 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1ac60 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
1ac80 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79  tly matches pKey
1ac90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
1aca0 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
1acb0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1acc0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1acd0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1ace0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
1acf0 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a  ger than pKey..*
1ad00 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
1ad10 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  BtreeMoveto(.  B
1ad20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1ad30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1ad40 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
1ad50 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1ad60 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1ad70 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66  he key content f
1ad80 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  or indices.  Not
1ad90 20 75 73 65 64 20 62 79 20 74 61 62 6c 65 73 20   used by tables 
1ada0 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1adc0 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72  ize of pKey.  Or
1add0 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62   the key for tab
1ade0 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  les */.  int bia
1adf0 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
1ae00 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
1ae10 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
1ae20 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
1ae30 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
1ae40 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
1ae50 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f  h result flag */
1ae60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
1ae70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1ae80 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ae90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1aea0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1aeb0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53  pCur->pBtree->pS
1aec0 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b  qlite->mutex) );
1aed0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1aee0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1aef0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1af00 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1af10 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
1af20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1af30 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
1af40 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1af50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1af60 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1af70 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1af80 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1af90 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1afa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1afb0 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b  OK;.  }.  for(;;
1afc0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
1afd0 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
1afe0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
1aff0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1b000 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20  >pPage;.    int 
1b010 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73  c = -1;  /* pRes
1b020 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65   return if table
1b030 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62   is empty must b
1b040 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20  e -1 */.    lwr 
1b050 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
1b060 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1b070 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
1b080 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30  ntKey && pKey==0
1b090 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b0a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1b0b0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1b0c0 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
1b0d0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1b0e0 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73   = upr;.    }els
1b0f0 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  e{.      pCur->i
1b100 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32  dx = (upr+lwr)/2
1b110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b120 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b  lwr<=upr ) for(;
1b130 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ;){.      void *
1b140 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
1b150 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
1b160 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1b170 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
1b180 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1b190 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  y ){.        u8 
1b1a0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pCell;.        
1b1b0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1b1c0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1b1d0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
1b1e0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
1b1f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
1b200 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1b210 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
1b220 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
1b230 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
1b240 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  l, &dummy);.    
1b250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
1b260 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
1b270 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  u64 *)&nCellKey)
1b280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
1b290 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20  ellKey<nKey ){. 
1b2a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
1b2b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1b2c0 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79  f( nCellKey>nKey
1b2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1b2e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = +1;.        }e
1b2f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1b300 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1b310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b320 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62       int availab
1b330 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  le;.        pCel
1b340 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66  lKey = (void *)f
1b350 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1b360 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29  , &available, 0)
1b370 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b  ;.        nCellK
1b380 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
1b390 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nKey;.        if
1b3a0 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65  ( available>=nCe
1b3b0 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  llKey ){.       
1b3c0 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f     c = pCur->xCo
1b3d0 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67  mpare(pCur->pArg
1b3e0 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
1b3f0 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
1b400 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1b410 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  {.          pCel
1b420 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  lKey = sqlite3_m
1b430 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20  alloc( nCellKey 
1b440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1b450 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72   pCellKey==0 ) r
1b460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1b470 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  EM;.          rc
1b480 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1b490 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ey(pCur, 0, nCel
1b4a0 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43  lKey, (void *)pC
1b4b0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1b4c0 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f     c = pCur->xCo
1b4d0 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67  mpare(pCur->pArg
1b4e0 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
1b4f0 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
1b500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1b510 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
1b520 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1b530 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1b540 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b550 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b560 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b570 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1b580 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1b590 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21  e->leafData && !
1b5a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1b5b0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70           lwr = p
1b5c0 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20  Cur->idx;.      
1b5d0 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
1b5e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1b5f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1b600 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
1b610 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
1b620 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  0;.          ret
1b630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b650 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
1b660 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
1b670 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20  pCur->idx+1;.   
1b680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b690 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64    upr = pCur->id
1b6a0 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
1b6b0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
1b6c0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1b6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b6e0 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b  Cur->idx = (lwr+
1b6f0 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20  upr)/2;.    }.  
1b700 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
1b710 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  pr+1 );.    asse
1b720 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1b730 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
1b740 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1b750 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20    chldPg = 0;.  
1b760 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
1b770 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
1b780 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1b790 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1b7a0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1b7b0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1b7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
1b7d0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
1b7e0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b7f0 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
1b800 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29   if( chldPg==0 )
1b810 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b820 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1b830 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
1b840 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1b850 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
1b860 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
1b870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b880 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  OK;.    }.    pC
1b890 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20  ur->idx = lwr;. 
1b8a0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1b8b0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ize = 0;.    rc 
1b8c0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1b8d0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
1b8e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1b8f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b900 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52  }.  }.  /* NOT R
1b910 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  EACHED */.}.../*
1b920 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1b930 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1b940 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1b950 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1b960 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1b970 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1b980 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1b990 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1b9a0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1b9b0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1b9c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1b9d0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1b9e0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1b9f0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1ba00 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1ba10 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1ba20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1ba30 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1ba40 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1ba50 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1ba60 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1ba70 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1ba80 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1ba90 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1baa0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1bab0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1bac0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1bad0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1bae0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1baf0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1bb00 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1bb10 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1bb20 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1bb30 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1bb40 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1bb50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1bb60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1bb70 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ion handle for a
1bb80 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69   cursor..*/.sqli
1bb90 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65  te3 *sqlite3Btre
1bba0 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20  eCursorDb(const 
1bbb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1bbc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bbd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1bbe0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  ur->pBtree->pSql
1bbf0 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
1bc00 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
1bc10 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 7d  tree->pSqlite;.}
1bc20 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1bc30 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1bc40 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
1bc50 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1bc60 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1bc70 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1bc80 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1bc90 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1bca0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1bcb0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1bcc0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1bcd0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1bce0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1bcf0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1bd00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
1bd10 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
1bd20 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1bd30 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1bd40 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1bd50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1bd60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1bd70 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1bd80 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
1bd90 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1bda0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bdb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1bdc0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1bdd0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
1bde0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1bdf0 50 61 67 65 3b 0a 20 20 69 66 28 20 43 55 52 53  Page;.  if( CURS
1be00 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1be10 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1be20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1be30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1be40 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1be50 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70  >skip>0 ){.    p
1be60 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1be70 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1be80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1be90 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1bea0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73  skip = 0;..  ass
1beb0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1bec0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
1bed0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1bee0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
1bef0 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72  r->idx++;.  pCur
1bf00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1bf10 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  ;.  if( pCur->id
1bf20 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1bf30 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
1bf40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1bf50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1bf60 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
1bf70 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1bf80 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1bf90 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
1bfa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1bfb0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1bfc0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1bfd0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1bfe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1bff0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
1c000 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1c010 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1c020 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1c030 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c040 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
1c050 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1c060 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
1c070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c090 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1c0a0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1c0b0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1c0c0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68  ->pPage;.    }wh
1c0d0 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ile( pCur->idx>=
1c0e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1c0f0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1c100 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1c110 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
1c120 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1c130 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
1c140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c150 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c160 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
1c170 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
1c180 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
1c190 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c1a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c1b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
1c1c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1c1d0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
1c1e0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
1c1f0 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
1c200 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1c210 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1c220 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c230 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c240 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
1c250 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
1c260 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c270 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
1c280 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1c290 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1c2a0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1c2b0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1c2c0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1c2d0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1c2e0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1c2f0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1c300 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1c310 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1c320 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c330 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c340 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c350 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1c370 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1c380 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1c390 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1c3a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1c3b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1c3c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1c3d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1c3e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1c3f0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
1c400 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1c410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c420 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1c430 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1c440 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1c450 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1c460 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c480 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1c490 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
1c4a0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1c4b0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1c4c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c4d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1c4e0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
1c4f0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1c500 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1c510 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1c520 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1c530 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28  >idx>=0 );.  if(
1c540 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c550 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1c560 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70  byte( findCell(p
1c570 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1c580 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   );.    rc = mov
1c590 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1c5a0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1c5b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c5c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1c5d0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
1c5e0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
1c5f0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
1c600 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20  Cur->idx==0 ){. 
1c610 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c620 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28  BtreeIsRootPage(
1c630 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  pPage) ){.      
1c640 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1c650 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1c660 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
1c670 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1c680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c690 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c6a0 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
1c6b0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1c6c0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1c6d0 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20  pPage;.    }.   
1c6e0 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20   pCur->idx--;.  
1c6f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c700 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ze = 0;.    if( 
1c710 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
1c720 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
1c730 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1c740 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1c750 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
1c760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
1c790 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
1c7a0 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
1c7b0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1c7c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1c7d0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1c7e0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1c7f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1c800 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1c810 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
1c820 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 72 65  Cur, pRes);.  re
1c830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c840 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1c850 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
1c860 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1c870 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
1c880 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
1c890 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
1c8a0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
1c8b0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
1c8c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1c8d0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
1c8e0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
1c8f0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
1c900 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
1c910 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
1c920 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
1c930 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
1c940 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
1c950 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
1c960 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
1c970 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
1c980 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1c990 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1c9a0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
1c9b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1c9c0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
1c9d0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
1c9e0 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
1c9f0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
1ca00 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
1ca10 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
1ca20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ca30 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
1ca40 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
1ca50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1ca60 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
1ca70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1ca80 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c  0, then a (feebl
1ca90 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  e) effort is mad
1caa0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
1cab0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
1cac0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1cad0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
1cae0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
1caf0 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
1cb00 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
1cb10 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
1cb20 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
1cb30 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
1cb40 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
1cb50 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
1cb60 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
1cb70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61  *.** If the "exa
1cb80 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  ct" parameter is
1cb90 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20   not 0, and the 
1cba0 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72  page-number near
1cbb0 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e  by exists .** an
1cbc0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
1cbd0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
1cbe0 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
1cbf0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54  o be returned. T
1cc00 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75  his.** is only u
1cc10 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1cc20 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65  um databases whe
1cc30 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  n allocating a n
1cc40 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ew table..*/.sta
1cc50 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1cc60 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
1cc70 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d  hared *pBt, .  M
1cc80 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1cc90 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c   .  Pgno *pPgno,
1cca0 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c   .  Pgno nearby,
1ccb0 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20  .  u8 exact.){. 
1ccc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1ccd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1cce0 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t n;     /* Numb
1ccf0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1cd00 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1cd10 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   int k;     /* N
1cd20 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
1cd30 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
1cd40 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1cd50 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1cd60 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
1cd70 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
1cd80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1cd90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1cda0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1cdb0 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
1cdc0 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74  Page1;.  n = get
1cdd0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1cde0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28  Data[36]);.  if(
1cdf0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
1ce00 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
1ce10 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
1ce20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
1ce30 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
1ce40 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
1ce50 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
1ce60 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
1ce70 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
1ce80 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
1ce90 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
1cea0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
1ceb0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
1cec0 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
1ced0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
1cee0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
1cef0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
1cf00 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
1cf10 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
1cf20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
1cf30 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
1cf40 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
1cf50 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
1cf60 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
1cf70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cf80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1cf90 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
1cfa0 61 72 62 79 3c 3d 73 71 6c 69 74 65 33 50 61 67  arby<=sqlite3Pag
1cfb0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1cfc0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1cfd0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1cfe0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
1cff0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1d000 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
1d010 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
1d020 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d030 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
1d040 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1d050 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1d060 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1d070 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1d080 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
1d090 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
1d0a0 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
1d0b0 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
1d0c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
1d0d0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
1d0e0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
1d0f0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
1d100 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1d110 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
1d120 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
1d130 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
1d140 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
1d150 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1d160 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d170 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1d180 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1d190 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d1a0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1d1b0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
1d1c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
1d1d0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
1d1e0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
1d1f0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
1d200 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
1d210 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
1d220 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
1d230 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
1d240 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
1d250 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
1d260 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
1d270 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1d280 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
1d290 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
1d2a0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1d2b0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1d2c0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
1d2d0 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
1d2e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
1d2f0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1d300 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
1d310 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1d320 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1d330 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
1d340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1d350 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1d360 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
1d370 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
1d380 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1d390 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1d3a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1d3b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1d3c0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
1d3d0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
1d3e0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1d3f0 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
1d400 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
1d410 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
1d420 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
1d430 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
1d440 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
1d450 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
1d460 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
1d470 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
1d480 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
1d490 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
1d4a0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
1d4b0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
1d4c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d4d0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
1d4e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1d4f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d500 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1d510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1d530 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1d540 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1d550 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1d560 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
1d570 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1d580 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1d590 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1d5a0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
1d5b0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
1d5c0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1d5d0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1d5e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
1d5f0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
1d600 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
1d610 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1d620 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42    }else if( k>pB
1d630 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
1d640 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  - 8 ){.        /
1d650 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
1d660 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
1d670 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1d680 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
1d690 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1d6a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1d6b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1d6c0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
1d6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d6e0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
1d6f0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
1d700 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
1d710 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
1d720 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
1d730 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
1d740 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
1d750 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
1d760 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
1d770 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
1d780 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
1d790 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
1d7a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
1d7b0 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
1d7c0 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
1d7d0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1d7e0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1d7f0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
1d800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d810 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1d820 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1d830 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d840 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1d850 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1d860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d870 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
1d880 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1d890 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1d8a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1d8b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1d8c0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1d8d0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1d8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d8f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
1d900 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1d910 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1d920 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1d930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1d940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1d950 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
1d960 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
1d970 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
1d980 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
1d990 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
1d9a0 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
1d9b0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
1d9c0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
1d9d0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
1d9e0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
1d9f0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1da00 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
1da10 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
1da20 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1da30 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
1da40 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1da50 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
1da60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1da70 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1da80 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
1da90 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1daa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1dab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dac0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1dad0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1dae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1daf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1db00 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
1db10 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1db20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1db30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1db40 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1db50 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
1db60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
1db70 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1db80 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1db90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
1dba0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
1dbb0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1dbc0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1dbd0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1dbe0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
1dbf0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1dc00 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1dc10 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1dc20 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
1dc30 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
1dc40 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
1dc50 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1dc60 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1dc70 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1dc80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dc90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1dca0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
1dcb0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1dcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dcd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dce0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
1dcf0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
1dd00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1dd10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1dd20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1dd30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1dd40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dd50 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1dd60 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1dd70 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
1dd80 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
1dd90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dda0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1ddb0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1ddc0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1ddd0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1dde0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1ddf0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
1de00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1de10 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1de20 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
1de30 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
1de40 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20    int closest;. 
1de50 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
1de60 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
1de70 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
1de80 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
1de90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1dea0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1deb0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1dec0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ded0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1dee0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1def0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1df00 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
1df10 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
1df20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20    int i, dist;. 
1df30 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1df40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1df50 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
1df60 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
1df70 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
1df80 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
1df90 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
1dfa0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
1dfb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1dfc0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
1dfd0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
1dfe0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
1dff0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1e000 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
1e010 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e020 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
1e030 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1e040 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
1e050 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
1e060 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e090 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1e0a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1e0b0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
1e0c0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
1e0d0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
1e0e0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
1e0f0 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
1e100 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  y ){.          *
1e110 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
1e120 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50           if( *pP
1e130 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72  gno>sqlite3Pager
1e140 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1e150 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1e160 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
1e170 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
1e180 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
1e190 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e1a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e1b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1e1c0 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  }.          TRAC
1e1d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1e1e0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
1e1f0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
1e220 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
1e230 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
1e240 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
1e250 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
1e260 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
1e270 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
1e280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e290 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
1e2a0 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
1e2b0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
1e2c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e2d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
1e2e0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1e2f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e300 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1e310 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
1e320 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20  pPage, 1);.     
1e330 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e350 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e360 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28  erDontRollback((
1e370 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1e380 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e390 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e3a0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1e3b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e3c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e3d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e3e0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1e3f0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1e410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e420 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1e430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1e440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
1e450 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1e460 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
1e470 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
1e480 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
1e490 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1e4a0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1e4b0 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
1e4c0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
1e4d0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
1e4e0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
1e4f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1e500 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c      *pPgno = sql
1e510 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1e520 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1e530 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
1e540 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e550 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1e560 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
1e570 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63    /* An incr-vac
1e580 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  uum has already 
1e590 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  run within this 
1e5a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
1e5b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
1e5c0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73  e to allocate is
1e5d0 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68   not from the ph
1e5e0 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68  ysical end of th
1e5f0 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20  e file, but.    
1e600 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72    ** at pBt->nTr
1e610 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  unc. .      */. 
1e620 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42       *pPgno = pB
1e630 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20  t->nTrunc+1;.   
1e640 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
1e650 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e660 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
1e670 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1e680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1e690 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1e6a0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
1e6b0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
1e6c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1e6d0 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
1e6e0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1e6f0 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
1e700 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
1e710 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
1e720 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
1e730 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
1e740 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
1e750 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
1e760 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
1e770 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
1e780 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
1e790 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
1e7a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
1e7b0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1e7c0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1e7d0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
1e7e0 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
1e7f0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
1e800 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1e810 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e820 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50  t) );.      (*pP
1e830 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gno)++;.    }.  
1e840 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
1e850 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  c ){.      pBt->
1e860 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b  nTrunc = *pPgno;
1e870 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1e880 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1e890 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1e8a0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1e8b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e8c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
1e8d0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30  pPgno, ppPage, 0
1e8e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e8f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
1e900 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e910 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
1e920 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1e930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e940 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1e950 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
1e960 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
1e970 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
1e980 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
1e990 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
1e9a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
1e9b0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
1e9c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
1e9d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e9e0 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
1e9f0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
1ea00 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1ea10 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
1ea20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1ea30 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1ea40 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68  abase file to th
1ea50 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
1ea60 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
1ea70 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c  ref() is NOT cal
1ea80 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  led for pPage..*
1ea90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
1eaa0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
1eab0 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
1eac0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1ead0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
1eae0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1eaf0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20  age1;.  int rc, 
1eb00 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70  n, k;..  /* Prep
1eb10 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f 72  are the page for
1eb20 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73   freeing */.  as
1eb30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1eb40 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1eb50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1eb60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1eb70 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67  pgno>1 );.  pPag
1eb80 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
1eb90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1eba0 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
1ebb0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
1ebc0 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d   0;..  /* Increm
1ebd0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
1ebe0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
1ebf0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
1ec00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1ec10 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1ec20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1ec30 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34  n rc;.  n = get4
1ec40 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1ec50 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
1ec60 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1ec70 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a  ata[36], n+1);..
1ec80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
1ec90 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
1eca0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   If the SQLITE_S
1ecb0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d  ECURE_DELETE com
1ecc0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1ecd0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
1ece0 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75  n.  ** always fu
1ecf0 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
1ed00 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
1ed10 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
1ed20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1ed30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1ed40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
1ed50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1ed60 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  c;.  memset(pPag
1ed70 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
1ed80 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
1ed90 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  e);.#endif..#ifn
1eda0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1edb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
1edc0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1edd0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
1ede0 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
1edf0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
1ee00 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
1ee10 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1ee20 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
1ee30 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1ee40 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1ee50 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
1ee60 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  (pBt, pPage->pgn
1ee70 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  o, PTRMAP_FREEPA
1ee80 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
1ee90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1eea0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
1eeb0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
1eec0 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
1eed0 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
1eee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eef0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1ef00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1ef10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ef20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  rc;.    memset(p
1ef30 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
1ef40 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  8);.    put4byte
1ef50 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ef60 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
1ef70 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46  );.    TRACE(("F
1ef80 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72  REE-PAGE: %d fir
1ef90 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  st\n", pPage->pg
1efa0 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
1efb0 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65     /* Other free
1efc0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65   pages already e
1efd0 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74  xist.  Retrive t
1efe0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  he first trunk p
1eff0 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  age.    ** of th
1f000 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66  e freelist and f
1f010 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ind out how many
1f020 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20   leaves it has. 
1f030 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
1f040 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d  pTrunk;.    rc =
1f050 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1f060 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
1f070 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f080 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c  a[32]), &pTrunk,
1f090 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1f0a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f0b0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
1f0c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
1f0d0 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
1f0e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
1f0f0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
1f100 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
1f110 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
1f120 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
1f130 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
1f140 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
1f150 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20   no leaves. */. 
1f160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f170 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1f180 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1f190 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1f1a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74  rn rc;.      put
1f1b0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1f1c0 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  ta, pTrunk->pgno
1f1d0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1f1e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1f1f0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  4], 0);.      pu
1f200 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f210 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
1f220 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54  ->pgno);.      T
1f230 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
1f240 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
1f250 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
1f260 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f270 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
1f280 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
1f290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f2a0 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c   /* Add the newl
1f2b0 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20  y freed page as 
1f2c0 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75  a leaf on the cu
1f2d0 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20  rrent trunk */. 
1f2e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f2f0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1f300 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1f310 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f330 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
1f340 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31  k->aData[4], k+1
1f350 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1f360 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1f370 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
1f380 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
1f390 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1f3a0 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 73 71  ELETE.        sq
1f3b0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1f3c0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
1f3d0 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ge);.#endif.    
1f3e0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
1f3f0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1f400 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
1f410 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
1f420 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
1f430 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
1f440 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1f450 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
1f460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
1f470 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
1f480 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
1f490 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
1f4a0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
1f4b0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
1f4c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
1f4d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1f4e0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
1f4f0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1f500 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
1f510 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
1f520 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
1f530 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e   int nOvfl;.  in
1f540 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  t ovflPageSize;.
1f550 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f560 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1f570 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1f580 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
1f590 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
1f5a0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1f5b0 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
1f5c0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
1f5d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f5e0 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
1f5f0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
1f600 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1f610 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
1f620 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
1f630 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
1f640 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
1f650 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
1f660 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1f670 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
1f680 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
1f690 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
1f6a0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
1f6b0 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
1f6c0 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
1f6d0 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
1f6e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
1f6f0 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50  fl-- ){.    MemP
1f700 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  age *pOvfl;.    
1f710 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  if( ovflPgno==0 
1f720 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69  || ovflPgno>sqli
1f730 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1f740 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
1f750 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1f760 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f770 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  PT;.    }..    r
1f780 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
1f790 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
1f7a0 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66  o, &pOvfl, (nOvf
1f7b0 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e  l==0)?0:&ovflPgn
1f7c0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
1f7d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f7e0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f  rc = freePage(pO
1f7f0 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
1f800 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
1f810 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
1f820 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f830 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
1f840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f850 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
1f860 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
1f870 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1f880 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
1f890 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
1f8a0 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
1f8b0 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
1f8c0 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
1f8d0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
1f8e0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
1f8f0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
1f900 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
1f910 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
1f920 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
1f930 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
1f940 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
1f950 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
1f960 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
1f970 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
1f980 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
1f990 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
1f9a0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
1f9b0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
1f9c0 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
1f9d0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
1f9e0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
1f9f0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
1fa00 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
1fa10 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
1fa20 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
1fa30 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
1fa40 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
1fa50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1fa60 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
1fa70 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
1fa80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fa90 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1faa0 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
1fab0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fac0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
1fad0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
1fae0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
1faf0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1fb00 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
1fb10 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
1fb20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1fb30 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
1fb40 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1fb50 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
1fb80 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
1fb90 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
1fba0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fbc0 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
1fbd0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1fbe0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
1fbf0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
1fc00 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
1fc10 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
1fc20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
1fc30 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
1fc40 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
1fc50 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1fc60 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
1fc70 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
1fc80 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
1fc90 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1fca0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
1fcb0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
1fcc0 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
1fcd0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
1fce0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1fcf0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1fd00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
1fd10 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
1fd20 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
1fd30 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
1fd40 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1fd50 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
1fd60 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1fd70 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
1fd80 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
1fd90 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
1fda0 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
1fdb0 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
1fdc0 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
1fdd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
1fde0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
1fdf0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
1fe00 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
1fe10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
1fe20 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
1fe30 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1fe40 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1fe50 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
1fe60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
1fe70 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
1fe80 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1fe90 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65  nData==nData+nZe
1fea0 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  ro );.  .  /* Fi
1feb0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
1fec0 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
1fed0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
1fee0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1fef0 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
1ff00 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
1ff10 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
1ff20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
1ff30 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
1ff40 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53   += nKey;.    pS
1ff50 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
1ff60 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  Src = nKey;.  }.
1ff70 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
1ff80 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
1ff90 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
1ffa0 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
1ffb0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
1ffc0 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
1ffd0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
1ffe0 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
1fff0 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
20000 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
20010 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
20020 45 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64  Exact = 0;.#ifnd
20030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20040 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
20050 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
20060 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
20070 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
20080 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
20090 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
200a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
200b0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
200c0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
200d0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
200e0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
200f0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
20100 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
20110 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
20120 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20130 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
20140 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f         if( pgnoO
20150 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  vfl>1 ){.       
20160 20 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20     /* isExact = 
20170 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  1; */.        }.
20180 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20190 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
201a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
201b0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
201c0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73  fl, pgnoOvfl, is
201d0 45 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  Exact);.#ifndef 
201e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
201f0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
20200 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
20210 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
20220 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
20230 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
20240 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
20250 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
20260 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
20270 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
20280 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
20290 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
202a0 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
202b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
202c0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
202d0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
202e0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
202f0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
20300 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
20310 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
20320 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
20330 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
20340 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
20350 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
20360 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
20370 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
20380 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
20390 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
203a0 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
203b0 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73  itialised values
203c0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
203d0 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
203e0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
203f0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
20400 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
20410 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
20420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20430 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
20440 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
20450 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
20460 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
20470 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
20480 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
20490 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
204a0 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  gnoPtrmap);.    
204b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
204c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
204d0 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
204e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
204f0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
20500 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
20510 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
20520 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
20530 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20540 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20550 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
20560 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
20570 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
20580 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
20590 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
205a0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
205b0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
205c0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
205d0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
205e0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
205f0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
20600 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
20610 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
20620 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
20630 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
20640 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
20650 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69  spaceLeft;.    i
20660 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
20670 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
20680 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
20690 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
206a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
206b0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
206c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
206d0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
206e0 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
206f0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
20700 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
20710 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
20720 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
20730 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
20740 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
20750 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
20760 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
20770 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
20780 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
20790 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
207a0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
207b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
207c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
207d0 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
207e0 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70  pointer on the p
207f0 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72  age whose number
20800 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20   is.** given in 
20810 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
20820 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50  ent so that MemP
20830 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64  age.pParent hold
20840 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  s the.** pointer
20850 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72   in the third ar
20860 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
20870 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61  c int reparentPa
20880 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ge(BtShared *pBt
20890 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d  , Pgno pgno, Mem
208a0 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74  Page *pNewParent
208b0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65  , int idx){.  Me
208c0 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20  mPage *pThis;.  
208d0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
208e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
208f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20900 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20910 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72 65  assert( pNewPare
20920 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  nt!=0 );.  if( p
20930 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  gno==0 ) return 
20940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
20950 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72  ert( pBt->pPager
20960 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65  !=0 );.  pDbPage
20970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
20980 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
20990 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
209a0 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70  pDbPage ){.    p
209b0 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20  This = (MemPage 
209c0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
209d0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
209e0 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e  .    if( pThis->
209f0 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  isInit ){.      
20a00 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61  assert( pThis->a
20a10 44 61 74 61 3d 3d 28 73 71 6c 69 74 65 33 50 61  Data==(sqlite3Pa
20a20 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
20a30 67 65 29 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ge)) );.      if
20a40 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  ( pThis->pParent
20a50 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a  !=pNewParent ){.
20a60 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68 69          if( pThi
20a70 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c  s->pParent ) sql
20a80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
20a90 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  This->pParent->p
20aa0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
20ab0 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
20ac0 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = pNewParent;.  
20ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20ae0 65 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74  erRef(pNewParent
20af0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20b00 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d    }.      pThis-
20b10 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78  >idxParent = idx
20b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20b30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
20b40 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66  bPage);.  }..#if
20b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
20b70 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20b80 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  m ){.    return 
20b90 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
20ba0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
20bb0 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  E, pNewParent->p
20bc0 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gno);.  }.#endif
20bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20be0 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK;.}..../*.** 
20bf0 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65  Change the pPare
20c00 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c  nt pointer of al
20c10 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
20c20 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63  age to point bac
20c30 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a  k.** to pPage..*
20c40 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
20c50 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63  rds, for every c
20c60 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69  hild of pPage, i
20c70 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61  nvoke reparentPa
20c80 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ge().** to make 
20c90 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63  sure that each c
20ca0 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20  hild knows that 
20cb0 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72  pPage is its par
20cc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
20cd0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
20ce0 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65  led after you me
20cf0 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20  mcpy() one page 
20d00 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e  into.** another.
20d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
20d20 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
20d30 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
20d40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74  ){.  int i;.  Bt
20d50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
20d60 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
20d70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20d80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20d90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
20da0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
20db0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
20dc0 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53  >leaf ) return S
20dd0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72  QLITE_OK;..  for
20de0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
20df0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
20e00 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
20e10 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
20e20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
20e30 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
20e40 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
20e50 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
20e60 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b  ell), pPage, i);
20e70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20e80 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
20e90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
20ea0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20eb0 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  af ){.    rc = r
20ec0 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
20ed0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
20ee0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
20ef0 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20  drOffset+8]), . 
20f00 20 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b        pPage, i);
20f10 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
20f20 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  hift = 0;.  }.  
20f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20f40 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
20f50 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
20f60 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
20f70 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
20f80 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
20f90 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
20fa0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
20fb0 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
20fc0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
20fd0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
20fe0 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
20ff0 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
21000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
21010 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
21020 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
21030 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
21040 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
21050 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
21060 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
21070 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
21080 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
21090 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
210a0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29  int idx, int sz)
210b0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
210c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
210d0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
210f0 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
21100 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
21110 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
21120 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
21130 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
21140 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
21150 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
21160 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
21170 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
21180 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
21190 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
211a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
211b0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
211c0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
211d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
211e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
211f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
21200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
21210 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21220 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
21230 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
21240 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
21250 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
21260 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
21270 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
21280 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
21290 20 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26   assert( pc>10 &
212a0 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e  & pc+sz<=pPage->
212b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
212c0 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70  );.  freeSpace(p
212d0 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
212e0 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c   for(i=idx+1; i<
212f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
21300 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20  +, ptr+=2){.    
21310 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b  ptr[0] = ptr[2];
21320 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74  .    ptr[1] = pt
21330 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  r[3];.  }.  pPag
21340 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
21350 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
21360 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
21370 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
21380 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
21390 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69  += 2;.  pPage->i
213a0 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a  dxShift = 1;.}..
213b0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
213c0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
213d0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
213e0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
213f0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
21400 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
21410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
21420 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
21430 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
21440 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
21450 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
21460 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
21470 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
21480 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
21490 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
214a0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
214b0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
214c0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
214d0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
214e0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
214f0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
21500 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
21510 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
21520 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
21530 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
21540 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
21550 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
21560 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
21570 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
21580 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
21590 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
215a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
215b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
215c0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
215d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
215e0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
215f0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
21600 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
21610 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
21620 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
21630 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
21640 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
21650 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
21660 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
21670 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
21680 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
21690 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
216a0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
216b0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
216c0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
216d0 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
216e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
216f0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
21700 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
21710 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
21720 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
21730 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
21740 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
21750 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
21760 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
21770 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
21780 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
21790 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
217a0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
217b0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
217c0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
217d0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
217e0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
217f0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
21800 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70  ed */.  u8 nSkip
21810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
21820 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69  not write the fi
21830 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
21840 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  of the cell */.)
21850 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
21860 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
21870 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
21880 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
21890 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
218a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
218b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
218c0 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
218d0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
218e0 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
218f0 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
21900 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
21910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21920 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
21930 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
21940 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
21950 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
21960 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
21970 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
21980 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
21990 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
219a0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
219b0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
219c0 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
219d0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
219e0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
219f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
21a00 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
21a10 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
21a20 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
21a30 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
21a40 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
21a50 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
21a60 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
21a70 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
21a80 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
21a90 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
21aa0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
21ab0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
21ac0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
21ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
21ae0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
21af0 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
21b00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21b10 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
21b20 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
21b30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
21b40 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
21b50 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
21b60 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
21b70 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
21b80 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
21b90 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
21ba0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
21bb0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
21bc0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
21bd0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
21be0 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70  sert( j<sizeof(p
21bf0 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
21c00 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
21c10 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  [0]) );.    pPag
21c20 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
21c30 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
21c40 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
21c50 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67  dx = i;.    pPag
21c60 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  e->nFree = 0;.  
21c70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
21c80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21c90 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
21ca0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
21cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21cd0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21ce0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
21cf0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
21d00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
21d10 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
21d20 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d  aData;.    hdr =
21d30 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
21d40 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  t;.    top = get
21d50 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
21d60 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  5]);.    cellOff
21d70 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
21d80 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
21d90 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
21da0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b  2*pPage->nCell +
21db0 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65   2;.    ins = ce
21dc0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
21dd0 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f      if( end > to
21de0 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20  p - sz ){.      
21df0 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
21e00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
21e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21e20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
21e30 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74  .      top = get
21e40 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
21e50 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  5]);.      asser
21e60 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74  t( end + sz <= t
21e70 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op );.    }.    
21e80 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
21e90 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a  ace(pPage, sz);.
21ea0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
21eb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21ec0 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65   end <= get2byte
21ed0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
21ee0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
21ef0 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
21f00 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20  >nFree -= 2;.   
21f10 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
21f20 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
21f30 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
21f40 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d  ;.    for(j=end-
21f50 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b  2, ptr=&data[j];
21f60 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74   j>ins; j-=2, pt
21f70 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72  r-=2){.      ptr
21f80 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20  [0] = ptr[-2];. 
21f90 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74       ptr[1] = pt
21fa0 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  r[-1];.    }.   
21fb0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
21fc0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
21fd0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
21fe0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
21ff0 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
22000 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23  >idxShift = 1;.#
22010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22020 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22030 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
22040 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
22050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
22060 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
22070 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
22080 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
22090 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
220a0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
220b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
220c0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
220d0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
220e0 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
220f0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c   info;.      sql
22100 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
22110 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
22120 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
22130 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
22140 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
22150 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
22160 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
22170 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
22180 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
22190 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
221a0 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
221b0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
221c0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
221d0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
221e0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
221f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
22200 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
22210 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
22220 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
22230 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
22240 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22250 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
22260 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
22270 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
22280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22290 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
222a0 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
222b0 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
222c0 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
222d0 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
222e0 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
222f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
22300 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
22310 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
22320 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
22330 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
22340 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
22350 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
22360 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
22370 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
22380 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
22390 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
223a0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
223b0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
223c0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
223d0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a  s */.  int *aSiz
223e0 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
223f0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
22400 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
22410 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22420 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
22430 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20  t totalSize;    
22440 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
22450 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20   all cells */.  
22460 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
22470 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61    /* Index of pa
22480 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
22490 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20  nt cellptr;     
224a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
224b0 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
224c0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
224d0 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
224e0 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
224f0 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61  body */.  u8 *da
22500 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ta;         /* D
22510 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
22520 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
22530 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
22540 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22560 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
22570 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c  utex) );.  total
22580 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Size = 0;.  for(
22590 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
225a0 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a  +){.    totalSiz
225b0 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  e += aSize[i];. 
225c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74   }.  assert( tot
225d0 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d  alSize+2*nCell<=
225e0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a  pPage->nFree );.
225f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22600 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63  >nCell==0 );.  c
22610 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e  ellptr = pPage->
22620 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61  cellOffset;.  da
22630 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
22640 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
22650 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70  ->hdrOffset;.  p
22660 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
22670 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
22680 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  if( nCell ){.   
22690 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f   cellbody = allo
226a0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
226b0 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20   totalSize);.   
226c0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
226d0 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  y>0 );.    asser
226e0 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t( pPage->nFree 
226f0 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  >= 2*nCell );.  
22700 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
22710 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66  = 2*nCell;.    f
22720 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
22730 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74   i++){.      put
22740 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
22750 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  ptr], cellbody);
22760 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64  .      memcpy(&d
22770 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
22780 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b  pCell[i], aSize[
22790 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70  i]);.      cellp
227a0 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63  tr += 2;.      c
227b0 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65  ellbody += aSize
227c0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
227d0 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d  ssert( cellbody=
227e0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
227f0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20  bleSize );.  }. 
22800 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
22810 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nCell;.}../*.** 
22820 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
22830 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
22840 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
22850 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
22860 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
22870 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
22880 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
22890 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
228a0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
228b0 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
228c0 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
228d0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
228e0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
228f0 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
22900 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
22910 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
22920 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
22930 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
22940 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
22950 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
22960 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
22970 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
22980 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
22990 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
229a0 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
229b0 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
229c0 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
229d0 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
229e0 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
229f0 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
22a00 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
22a10 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
22a20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
22a30 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
22a40 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
22a50 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
22a60 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
22a70 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
22a80 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
22a90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22aa0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
22ab0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
22ac0 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
22ad0 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
22ae0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
22af0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
22b00 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a  e balance */../*
22b10 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
22b20 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
22b30 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65   balance(MemPage
22b40 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65  *, int);..#ifnde
22b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
22b60 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
22b70 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
22b80 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
22b90 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
22ba0 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
22bb0 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
22bc0 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
22bd0 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
22be0 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
22bf0 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
22c00 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
22c10 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
22c20 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
22c30 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
22c40 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
22c50 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
22c60 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
22c70 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
22c80 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
22c90 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
22ca0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
22cb0 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
22cc0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
22cd0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
22ce0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
22cf0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
22d00 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
22d10 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
22d20 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
22d30 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
22d40 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
22d50 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
22d60 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
22d70 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
22d80 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
22d90 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
22da0 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
22db0 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
22dc0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
22dd0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
22de0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
22df0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
22e00 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
22e10 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
22e20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
22e30 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
22e40 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
22e50 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
22e60 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
22e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
22e80 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
22e90 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50  age *pPage, MemP
22ea0 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20  age *pParent){. 
22eb0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
22ec0 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f  ge *pNew;.  Pgno
22ed0 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a   pgnoNew;.  u8 *
22ee0 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43  pCell;.  int szC
22ef0 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ell;.  CellInfo 
22f00 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64  info;.  BtShared
22f10 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
22f20 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74  Bt;.  int parent
22f30 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Idx = pParent->n
22f40 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65  Cell;   /* pPare
22f50 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  nt new divider c
22f60 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
22f70 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20  nt parentSize;  
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20   /* Size of new 
22fa0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
22fb0 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b    u8 parentCell[
22fc0 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  64];            
22fd0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
22fe0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
22ff0 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   cell */..  asse
23000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23010 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
23020 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
23030 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
23040 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74  w page. Insert t
23050 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
23060 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a   from pPage.  **
23070 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72   into it. Then r
23080 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c  emove the overfl
23090 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
230a0 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
230b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
230c0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
230d0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  gnoNew, 0, 0);. 
230e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
230f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
23100 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c   rc;.  }.  pCell
23110 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
23120 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65  0].pCell;.  szCe
23130 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
23140 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
23150 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
23160 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
23170 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67  );.  assemblePag
23180 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
23190 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70  l, &szCell);.  p
231a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
231b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  = 0;..  /* Set t
231c0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
231d0 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
231e0 20 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74   page to pParent
231f0 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61  . */.  pNew->pPa
23200 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
23210 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
23220 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
23230 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ge);..  /* pPage
23240 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
23250 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
23260 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65   pParent. Change
23270 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68   this.  ** so th
23280 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  at the right-chi
23290 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61  ld is the new pa
232a0 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  ge allocated abo
232b0 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67  ve and.  ** pPag
232c0 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f  e is the next-to
232d0 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20  -right child. . 
232e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
232f0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
23300 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
23310 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
23320 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c  >nCell-1);.  sql
23330 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
23340 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
23350 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63  ll, &info);.  rc
23360 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
23370 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
23380 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
23390 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e   0, 0, 0, &paren
233a0 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  tSize);.  if( rc
233b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
233c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
233d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65  }.  assert( pare
233e0 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72  ntSize<64 );.  r
233f0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
23400 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
23410 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
23420 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
23430 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23450 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75  urn rc;.  }.  pu
23460 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
23470 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
23480 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
23490 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34  e->pgno);.  put4
234a0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
234b0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
234c0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
234d0 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  New);..#ifndef S
234e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
234f0 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
23500 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
23510 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
23520 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
23530 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20  r map.  ** with 
23540 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
23550 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
23560 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
23570 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  he .  ** cell on
23580 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
23590 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
235a0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
235b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
235c0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
235d0 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
235e0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
235f0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
23600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23610 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23620 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
23630 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ew, 0);.    }.  
23640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
23660 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
23670 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23680 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
23690 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  f..  /* Release 
236a0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
236b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e   the new page an
236c0 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  d balance the pa
236d0 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20  rent page,.  ** 
236e0 69 6e 20 63 61 73 65 20 74 68 65 20 64 69 76 69  in case the divi
236f0 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65  der cell inserte
23700 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62  d caused it to b
23710 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a  ecome overfull..
23720 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61    */.  releasePa
23730 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ge(pNew);.  retu
23740 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65  rn balance(pPare
23750 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  nt, 0);.}.#endif
23760 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23770 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
23780 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23790 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
237a0 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  s Cells on pPage
237b0 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20   and up to NN*2 
237c0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70  siblings.** of p
237d0 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c  Page so that all
237e0 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
237f0 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e  t the same amoun
23800 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e  t of free space.
23810 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73  .** Usually NN s
23820 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65  iblings on eithe
23830 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
23840 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  is used in the b
23850 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f  alancing,.** tho
23860 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67  ugh more sibling
23870 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
23880 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50  m one side if pP
23890 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
238a0 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  .** or last chil
238b0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
238c0 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66    If pPage has f
238d0 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73  ewer than 2*NN s
238e0 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65  iblings.** (some
238f0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
23900 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70  only happen if p
23910 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  Page is the root
23920 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63   page or a .** c
23930 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68  hild of root) th
23940 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  en all available
23950 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63   siblings partic
23960 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
23970 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
23980 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
23990 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69  ings of pPage mi
239a0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
239b0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
239c0 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69   one or.** two i
239d0 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
239e0 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
239f0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
23a00 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f  er full. The roo
23a10 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65  t page.** is spe
23a20 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f  cial and is allo
23a30 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79  wed to be nearly
23a40 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65   empty. If pPage
23a50 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   is .** the root
23a60 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
23a70 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65  depth of the tre
23a80 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
23a90 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65  ased.** or decre
23aa0 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20  ased by one, as 
23ab0 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65  necessary, to ke
23ac0 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ep the root page
23ad0 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f   from being.** o
23ae0 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c  verfull or compl
23af0 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a  etely empty..**.
23b00 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
23b10 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23b20 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
23b30 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70  f the Cells on p
23b40 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  Page.** might no
23b50 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
23b60 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61  ored in pPage->a
23b70 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61  Data[].  This ca
23b80 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
23b90 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
23ba0 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68  ull.  Part of th
23bb0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
23bc0 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d  utine is to.** m
23bd0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c  ake sure all Cel
23be0 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63  ls for pPage onc
23bf0 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70  e again fit in p
23c00 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a  Page->aData[]..*
23c10 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
23c20 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
23c30 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20  the siblings of 
23c40 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e  pPage, the paren
23c50 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69  t of pPage.** mi
23c60 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66  ght become overf
23c70 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
23c80 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65  .  If that happe
23c90 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ns, then this ro
23ca0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
23cb0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ed recursively o
23cc0 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a  n the parent..**
23cd0 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
23ce0 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
23cf0 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
23d00 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
23d10 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
23d20 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20  rrupted state.  
23d30 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
23d40 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
23d50 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
23d60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
23d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
23d80 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d  alance_nonroot(M
23d90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
23da0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
23db0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
23dc0 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20  * The parent of 
23dd0 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61  pPage */.  BtSha
23de0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
23df0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
23e00 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
23e10 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
23e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23e30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
23e40 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
23e50 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
23e60 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
23e70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
23e80 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
23e90 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
23ea0 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ec0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
23ed0 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
23ee0 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
23f10 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
23f20 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20    int nDiv;     
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
23f50 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a  s in apDiv[] */.
23f60 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f80 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
23f90 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50    /* Index of pP
23fc0 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  age in pParent->
23fd0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
23fe0 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
23ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
24000 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
24010 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
24020 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
24050 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
24060 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
24070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
24080 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
24090 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
240a0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
240c0 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
240d0 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
240e0 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
240f0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
24100 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
24110 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
24120 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
24130 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
24140 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
24150 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
24160 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
24170 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
24180 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
24190 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
241a0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
241b0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
241c0 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30    int iSpace = 0
241d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
241e0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
241f0 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20  yte of aSpace[] 
24200 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
24210 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
24220 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
24230 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
24240 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
24250 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
24260 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
24270 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
24280 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
24290 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
242a0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
242b0 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
242c0 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
242d0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
242e0 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
242f0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
24300 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
24310 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
24320 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
24330 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
24340 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
24350 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
24360 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
24370 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
24380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24390 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
243a0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
243b0 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
243c0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
243d0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
243e0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
243f0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
24400 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
24410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24420 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
24430 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
24440 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
24450 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
24460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
24470 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
24480 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
24490 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
244a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
244b0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
244c0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
244d0 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
244e0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
244f0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68    /* Space for h
24500 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61  olding data of a
24510 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCopy[] */.  u8 
24520 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *aSpace;        
24530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
24540 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65  ce to hold copie
24550 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
24560 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  lls */.#ifndef S
24570 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24580 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f  ACUUM.  u8 *aFro
24590 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  m = 0;.#endif.. 
245a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
245b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
245c0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
245d0 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  ;..  /* .  ** Fi
245e0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
245f0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
24600 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
24610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24620 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
24630 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
24640 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e  Page) || pPage->
24650 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
24660 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
24670 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  Bt;.  pParent = 
24680 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
24690 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
246a0 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  t );.  if( SQLIT
246b0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
246c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
246d0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29  arent->pDbPage))
246e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
246f0 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28  c;.  }.  TRACE((
24700 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
24710 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
24720 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
24730 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
24740 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  no));..#ifndef S
24750 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
24760 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  BALANCE.  /*.  *
24770 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65  * A special case
24780 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72  :  If a new entr
24790 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  y has just been 
247a0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a  inserted into a.
247b0 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74    ** table (that
247c0 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74   is, a btree wit
247d0 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61  h integer keys a
247e0 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74  nd all data at t
247f0 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20  he leaves).  ** 
24800 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  and the new entr
24810 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  y is the right-m
24820 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ost entry in the
24830 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68   tree (it has th
24840 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b  e.  ** largest k
24850 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65  ey) then use the
24860 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65   special balance
24870 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65  _quick() routine
24880 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63   for.  ** balanc
24890 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75  ing.  balance_qu
248a0 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61  ick() is much fa
248b0 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73  ster and results
248c0 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20   in a tighter.  
248d0 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61  ** packing of da
248e0 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ta in the common
248f0 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
24900 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  ( pPage->leaf &&
24910 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
24920 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50  tKey &&.      pP
24930 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
24940 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
24950 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
24960 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
24970 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
24980 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
24990 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  Page->pParent->p
249a0 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20  gno!=1 &&.      
249b0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
249c0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
249d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
249e0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29  =pPage->pgno.  )
249f0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
24a00 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20  TODO: Check the 
24a10 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20  siblings to the 
24a20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49  left of pPage. I
24a30 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20  t may be that.  
24a40 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f    ** they are no
24a50 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65  t full and no ne
24a60 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  w page is requir
24a70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
24a80 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75  eturn balance_qu
24a90 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65  ick(pPage, pPare
24aa0 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
24ab0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
24ac0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
24ad0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
24ae0 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20  >pDbPage)) ){.  
24af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24b00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
24b10 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
24b20 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
24b30 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
24b40 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
24b50 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
24b60 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
24b70 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
24b80 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
24b90 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
24ba0 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
24bb0 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
24bc0 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
24bd0 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
24be0 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78  if( pParent->idx
24bf0 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e  Shift ){.    Pgn
24c00 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f  o pgno;.    pgno
24c10 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
24c20 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
24c30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
24c40 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
24c50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
24c60 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70  for(idx=0; idx<p
24c70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69  Parent->nCell; i
24c80 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  dx++){.      if(
24c90 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
24ca0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29  ll(pParent, idx)
24cb0 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  )==pgno ){.     
24cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24cd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
24ce0 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d  rt( idx<pParent-
24cf0 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
24d00 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28      || get4byte(
24d10 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
24d20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24d30 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a  et+8])==pgno );.
24d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
24d50 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72   = pPage->idxPar
24d60 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ent;.  }..  /*. 
24d70 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76   ** Initialize v
24d80 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74  ariables so that
24d90 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65   it will be safe
24da0 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69   to jump.  ** di
24db0 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63  rectly to balanc
24dc0 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79  e_cleanup at any
24dd0 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20   moment..  */.  
24de0 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b  nOld = nNew = 0;
24df0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
24e00 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
24e10 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  age);..  /*.  **
24e20 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61   Find sibling pa
24e30 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64  ges to pPage and
24e40 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
24e50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64  arent that divid
24e60 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69  e.  ** the sibli
24e70 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74  ngs.  An attempt
24e80 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
24e90 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
24ea0 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65  either.  ** side
24eb0 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65   of pPage.  More
24ec0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
24ed0 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
24ee0 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20  e, however, if. 
24ef0 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20   ** pPage there 
24f00 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
24f10 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
24f20 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49  e other side.  I
24f30 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
24f40 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
24f50 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
24f60 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
24f70 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a  rent are taken..
24f80 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69    */.  nxDiv = i
24f90 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e  dx - NN;.  if( n
24fa0 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72  xDiv + NB > pPar
24fb0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
24fc0 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e    nxDiv = pParen
24fd0 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20  t->nCell - NB + 
24fe0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44  1;.  }.  if( nxD
24ff0 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69  iv<0 ){.    nxDi
25000 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69  v = 0;.  }.  nDi
25010 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  v = 0;.  for(i=0
25020 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b  , k=nxDiv; i<NB;
25030 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20   i++, k++){.    
25040 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e  if( k<pParent->n
25050 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70  Cell ){.      ap
25060 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
25070 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20  l(pParent, k);. 
25080 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20       nDiv++;.   
25090 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72     assert( !pPar
250a0 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  ent->leaf );.   
250b0 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
250c0 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
250d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
250e0 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ( k==pParent->nC
250f0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  ell ){.      pgn
25100 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79  oOld[i] = get4by
25110 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
25120 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25130 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
25140 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
25150 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
25160 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
25170 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d  (pBt, pgnoOld[i]
25180 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61  , &apOld[i], pPa
25190 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  rent);.    if( r
251a0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
251b0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70  _cleanup;.    ap
251c0 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e  Old[i]->idxParen
251d0 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70  t = k;.    apCop
251e0 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73  y[i] = 0;.    as
251f0 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b  sert( i==nOld );
25200 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20  .    nOld++;.   
25210 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
25220 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
25230 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
25240 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  low;.  }..  /* M
25250 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
25260 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20 69 6e  multiple of 2 in
25270 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
25280 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
25290 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
252a0 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
252b0 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20  ells + 1)&~1;.. 
252c0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
252d0 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
252e0 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
252f0 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
25300 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 0a 20  lite3_malloc( . 
25310 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
25320 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
25350 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
25360 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  lls*sizeof(int) 
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
25390 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f  ell */.     + RO
253a0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
253b0 61 67 65 29 29 2a 4e 42 20 20 20 20 20 20 20 20  age))*NB        
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
253d0 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b   aCopy */.     +
253e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28   pBt->pageSize*(
253f0 35 2b 4e 42 29 20 20 20 20 20 20 20 20 20 20 20  5+NB)           
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20   /* aSpace */.  
25420 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55     + (ISAUTOVACU
25430 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a  UM ? nMaxCells :
25440 20 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20   0)             
25450 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f       /* aFrom */
25460 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65  .  );.  if( apCe
25470 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
25480 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25490 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
254a0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
254b0 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26  szCell = (int*)&
254c0 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
254d0 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20  ];.  aCopy[0] = 
254e0 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
254f0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
25500 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20  t( ((aCopy[0] - 
25510 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
25520 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
25530 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
25540 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ired */.  for(i=
25550 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20  1; i<NB; i++){. 
25560 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61     aCopy[i] = &a
25570 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70  Copy[i-1][pBt->p
25580 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
25590 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
255a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
255b0 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29  aCopy[i] - (u8*)
255c0 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
255d0 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
255e0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
255f0 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20  */.  }.  aSpace 
25600 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70  = &aCopy[NB-1][p
25610 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
25620 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
25630 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge))];.  assert(
25640 20 28 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a   ((aSpace - (u8*
25650 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30  )apCell) & 7)==0
25660 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
25670 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
25680 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
25690 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
256a0 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  UM.  if( pBt->au
256b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
256c0 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b  aFrom = &aSpace[
256d0 35 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  5*pBt->pageSize]
256e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
256f0 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63    /*.  ** Make c
25700 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e  opies of the con
25710 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e  tent of pPage an
25720 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69  d its siblings i
25730 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a  nto aOld[]..  **
25740 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
25750 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
25760 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
25770 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
25780 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72    ** that the or
25790 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e  iginal pages sin
257a0 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ce the original 
257b0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e  pages will be in
257c0 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73   the.  ** proces
257d0 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
257e0 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ritten..  */.  f
257f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
25800 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
25810 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d  e *p = apCopy[i]
25820 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 43   = (MemPage*)&aC
25830 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65  opy[i][pBt->page
25840 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44  Size];.    p->aD
25850 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b  ata = &((u8*)p)[
25860 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  -pBt->pageSize];
25870 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
25880 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
25890 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
258a0 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65  Size + sizeof(Me
258b0 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20  mPage));.    /* 
258c0 54 68 65 20 6d 65 6d 63 70 79 28 29 20 61 62 6f  The memcpy() abo
258d0 76 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ve changes the v
258e0 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44 61 74 61  alue of p->aData
258f0 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 0a 20   so we have to. 
25900 20 20 20 2a 2a 20 73 65 74 20 69 74 20 61 67 61     ** set it aga
25910 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44  in. */.    p->aD
25920 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b  ata = &((u8*)p)[
25930 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  -pBt->pageSize];
25940 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
25950 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
25960 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
25970 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
25980 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
25990 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
259a0 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
259b0 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
259c0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
259d0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
259e0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
259f0 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61   form aSpace[] a
25a00 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
25a10 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
25a20 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
25a30 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
25a40 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
25a50 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
25a60 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
25a70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
25a80 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
25a90 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
25aa0 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
25ab0 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
25ac0 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
25ad0 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69  Space[].  In thi
25ae0 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
25af0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
25b00 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
25b10 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
25b20 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
25b30 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
25b40 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
25b50 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
25b60 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
25b70 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
25b80 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
25b90 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
25ba0 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
25bb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
25bc0 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
25bd0 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
25be0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
25bf0 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
25c00 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
25c10 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
25c20 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
25c30 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
25c40 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a  */.  nCell = 0;.
25c50 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
25c60 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34   = pPage->leaf*4
25c70 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70  ;.  leafData = p
25c80 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
25c90 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  & pPage->leaf;. 
25ca0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
25cb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
25cc0 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
25cd0 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c  py[i];.    int l
25ce0 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
25cf0 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
25d00 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
25d10 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
25d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
25d30 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
25d40 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
25d50 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
25d60 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
25d70 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
25d80 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
25d90 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
25da0 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65  [nCell]);.#ifnde
25db0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25dc0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
25dd0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
25de0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  um ){.        in
25df0 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72  t a;.        aFr
25e00 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20  om[nCell] = i;. 
25e10 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20         for(a=0; 
25e20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  a<pOld->nOverflo
25e30 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; a++){.       
25e40 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76     if( pOld->aOv
25e50 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43  fl[a].pCell==apC
25e60 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20  ell[nCell] ){.  
25e70 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
25e80 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
25e90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
25ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25ec0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65  #endif.      nCe
25ed0 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
25ee0 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a  if( i<nOld-1 ){.
25ef0 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63        int sz = c
25f00 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
25f10 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
25f20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
25f30 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
25f40 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54  With the LEAFDAT
25f50 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20  A flag, pParent 
25f60 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20  cells hold only 
25f70 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20  INTKEYs that.   
25f80 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c       ** are dupl
25f90 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f  icates of keys o
25fa0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
25fb0 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  s.  We need to r
25fc0 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a  emove.        **
25fd0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
25fe0 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c  ls from pParent,
25ff0 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72   but the divider
26000 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a  s cells are not.
26010 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
26020 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63   to apCell[] bec
26030 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75  ause they are du
26040 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c  plicates of chil
26050 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20  d cells..       
26060 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70   */.        drop
26070 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
26080 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
26090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
260a0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
260b0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
260c0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
260d0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
260e0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  l] = sz;.       
260f0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
26100 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  [iSpace];.      
26110 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a    iSpace += sz;.
26120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26130 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67  iSpace<=pBt->pag
26140 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20  eSize*5 );.     
26150 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
26160 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
26170 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
26180 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
26190 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69  afCorrection;.#i
261a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
261b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
261c0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
261d0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
261e0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
261f0 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
26200 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26210 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
26220 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
26230 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
26240 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43  [nCell] -= leafC
26250 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
26260 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
26270 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
26280 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
26290 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
262a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
262b0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
262c0 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
262d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
262e0 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
262f0 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
26300 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
26310 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
26320 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
26330 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
26340 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
26350 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
26360 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
26370 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
26380 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
26390 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
263a0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
263b0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
263c0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
263d0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
263e0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
263f0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
26400 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
26410 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
26420 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
26430 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
26440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26450 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
26460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26470 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
26480 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
26490 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
264a0 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
264b0 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
264c0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
264d0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
264e0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
264f0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
26500 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
26510 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
26520 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
26530 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
26540 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
26550 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
26560 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
26570 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
26580 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
26590 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
265a0 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
265b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
265c0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
265d0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
265e0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
265f0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
26600 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
26610 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
26620 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
26630 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
26640 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
26650 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
26660 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
26670 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
26680 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
26690 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
266a0 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
266b0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
266c0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
266d0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
266e0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
266f0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
26700 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
26710 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
26720 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
26730 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
26740 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
26750 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
26760 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
26770 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
26780 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
26790 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
267a0 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
267b0 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
267c0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
267d0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
267e0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
267f0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
26800 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
26810 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
26820 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
26830 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
26840 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
26850 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
26860 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
26870 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
26880 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
26890 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
268a0 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
268b0 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
268c0 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
268d0 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
268e0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
268f0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
26900 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
26910 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
26920 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
26930 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
26940 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
26950 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
26960 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
26970 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
26980 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
26990 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
269a0 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
269b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
269c0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
269d0 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
269e0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
269f0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
26a00 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
26a10 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
26a20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
26a30 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
26a40 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
26a50 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
26a60 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
26a70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
26a80 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
26a90 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
26aa0 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
26ab0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
26ac0 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
26ad0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
26ae0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
26af0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
26b00 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
26b10 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
26b20 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
26b30 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
26b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
26b50 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
26b60 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
26b70 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
26b80 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
26b90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
26ba0 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
26bb0 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
26bc0 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
26bd0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
26be0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
26bf0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
26c00 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
26c10 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
26c20 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
26c30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
26c40 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
26c50 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
26c60 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
26c70 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
26c80 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
26c90 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
26ca0 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
26cb0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
26cc0 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
26cd0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
26ce0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
26cf0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
26d00 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
26d10 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
26d20 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
26d30 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
26d40 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
26d50 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
26d60 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
26d70 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
26d80 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
26d90 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
26da0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
26db0 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
26dc0 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
26dd0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
26de0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
26df0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
26e00 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
26e10 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
26e20 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
26e30 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
26e40 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
26e50 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
26e60 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
26e70 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
26e80 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
26e90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
26ea0 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
26eb0 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
26ec0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
26ed0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
26ee0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
26ef0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
26f00 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
26f10 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
26f20 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
26f30 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
26f40 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
26f50 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
26f60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26f70 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
26f80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26f90 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
26fa0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
26fb0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
26fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
26fd0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
26fe0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
26ff0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
27000 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
27010 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
27020 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
27030 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
27040 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
27050 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
27060 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
27070 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61      }.    zeroPa
27080 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
27090 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  gs);.  }..  /* F
270a0 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
270b0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
270c0 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
270d0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
270e0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
270f0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
27100 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
27110 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
27120 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27130 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
27140 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
27150 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
27160 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
27170 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
27180 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
27190 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
271a0 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
271b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
271c0 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
271d0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
271e0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
271f0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
27200 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
27210 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
27220 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
27230 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
27240 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
27250 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
27260 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
27270 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
27280 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
27290 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
272a0 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
272b0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
272c0 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
272d0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
272e0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
272f0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
27300 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
27310 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
27320 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
27330 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
27340 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
27350 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
27360 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
27370 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
27380 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
27390 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
273a0 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
273b0 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
273c0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
273d0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
273e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
273f0 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e  ( pgnoNew[j]<(un
27400 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
27410 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
27420 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
27430 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20  pgnoNew[j];.    
27440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
27450 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
27460 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
27470 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
27480 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d    t = pgnoNew[i]
27490 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
274a0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ew[i];.      pgn
274b0 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65  oNew[i] = pgnoNe
274c0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
274d0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
274e0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e  minI];.      pgn
274f0 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a  oNew[minI] = t;.
27500 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
27510 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
27520 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  }.  TRACE(("BALA
27530 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
27540 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20  %d  new: %d(%d) 
27550 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
27560 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
27570 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20      pgnoOld[0], 
27580 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70  .    nOld>=2 ? p
27590 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20  gnoOld[1] : 0,. 
275a0 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e     nOld>=3 ? pgn
275b0 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  oOld[2] : 0,.   
275c0 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e   pgnoNew[0], szN
275d0 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
275e0 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20  =2 ? pgnoNew[1] 
275f0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
27600 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
27610 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e   nNew>=3 ? pgnoN
27620 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[2] : 0, nNew>
27630 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
27640 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
27650 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c   pgnoNew[3] : 0,
27660 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
27670 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
27680 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34  w>=5 ? pgnoNew[4
27690 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  ] : 0, nNew>=5 ?
276a0 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
276b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
276c0 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
276d0 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
276e0 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
276f0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
27700 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
27710 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
27720 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
27730 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
27740 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
27750 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
27760 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
27770 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
27780 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
27790 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
277a0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
277b0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
277c0 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70  t( pNew->pgno==p
277d0 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20  gnoNew[i] );.   
277e0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
277f0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
27800 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
27810 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
27820 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
27830 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
27840 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
27850 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27860 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
27870 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =0 );..#ifndef S
27880 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
27890 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20  ACUUM.    /* If 
278a0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
278b0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
278c0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
278d0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a  ter map entries.
278e0 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e      ** that poin
278f0 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67  t to the sibling
27900 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72  s that were rear
27910 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61  ranged. These ca
27920 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a  n be: left.    *
27930 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65  * children of ce
27940 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63  lls, the right-c
27950 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65  hild of the page
27960 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  , or overflow pa
27970 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ges.    ** point
27980 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a  ed to by cells..
27990 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
279a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
279b0 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b  {.      for(k=j;
279c0 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b   k<cntNew[i]; k+
279d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
279e0 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( k<nMaxCells 
279f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
27a00 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c  From[k]==0xFF ||
27a10 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d   apCopy[aFrom[k]
27a20 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  ]->pgno!=pNew->p
27a30 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gno ){.         
27a40 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
27a50 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a  vfl(pNew, k-j);.
27a60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27a80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27a90 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27aa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27ac0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
27ad0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
27ae0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
27af0 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
27b00 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
27b10 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
27b20 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
27b30 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
27b40 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
27b50 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
27b60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c     */.    if( i<
27b70 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c  nNew-1 && j<nCel
27b80 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
27b90 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
27ba0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
27bb0 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
27bc0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
27bd0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
27be0 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
27bf0 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
27c00 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
27c10 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  n;.      if( !pN
27c20 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
27c30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
27c40 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
27c50 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70  l, 4);.        p
27c60 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
27c70 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
27c80 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
27c90 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
27ca0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
27cb0 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
27cc0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
27cd0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
27ce0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
27cf0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
27d00 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
27d10 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
27d20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
27d30 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
27d40 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
27d50 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
27d60 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
27d70 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
27d80 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
27d90 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
27da0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
27db0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
27dc0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j--;.        sql
27dd0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
27de0 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
27df0 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
27e00 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26         pCell = &
27e10 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
27e20 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65          fillInCe
27e30 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  ll(pParent, pCel
27e40 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
27e50 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a   0, 0, 0, &sz);.
27e60 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b          iSpace +
27e70 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73  = sz;.        as
27e80 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42  sert( iSpace<=pB
27e90 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b  t->pageSize*5 );
27ea0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
27eb0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
27ec0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
27ed0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 4;.        pTe
27ee0 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  mp = &aSpace[iSp
27ef0 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  ace];.        iS
27f00 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
27f10 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
27f20 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
27f30 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  e*5 );.        /
27f40 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
27f50 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
27f60 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
27f70 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
27f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
27f90 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
27fa0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
27fb0 64 20 69 74 27 73 20 72 65 70 6f 72 74 65 64 20  d it's reported 
27fc0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
27fd0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
27fe0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
27ff0 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
28000 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
28010 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
28020 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28030 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
28040 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
28050 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
28060 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 27  y cell). But it'
28070 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
28080 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
28090 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
280a0 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
280b0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
280c0 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
280d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
280e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
280f0 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
28100 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
28110 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
28120 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
28130 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
28140 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
28150 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
28160 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
28170 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
28180 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
28190 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
281a0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
281b0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
281c0 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
281d0 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
281e0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
281f0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
28200 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
28210 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
28220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28230 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
28240 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
28250 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
28260 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20  pTemp, 4);.     
28270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28280 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
28290 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
282a0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
282b0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
282c0 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d  nt,nxDiv), pNew-
282d0 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20  >pgno);.#ifndef 
282e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
282f0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
28300 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
28310 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
28320 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65  se, and not a le
28330 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20  af-data tree,.  
28340 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61      ** then upda
28350 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
28360 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79  ap with an entry
28370 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
28380 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
28390 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75  that the cell ju
283a0 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e  st inserted poin
283b0 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a  ts to (if any)..
283c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
283d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
283e0 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61 20  um && !leafData 
283f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28400 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
28410 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20  arent, nxDiv);. 
28420 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28440 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
28450 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28460 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
28470 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ndif.      j++;.
28480 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
28490 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
284a0 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
284b0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
284c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
284d0 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
284e0 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
284f0 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  AF)==0 ){.    me
28500 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
28510 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  -1]->aData[8], &
28520 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
28530 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20  aData[8], 4);.  
28540 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  }.  if( nxDiv==p
28550 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
28560 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
28570 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
28580 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
28590 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
285a0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
285b0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
285c0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
285d0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
285e0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
285f0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
28600 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
28610 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
28620 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
28630 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
28640 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
28650 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
28660 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
28670 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
28680 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
28690 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
286a0 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
286b0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
286c0 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e   /*.  ** Reparen
286d0 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c  t children of al
286e0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  l cells..  */.  
286f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
28700 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
28710 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
28720 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  es(apNew[i]);.  
28730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28740 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
28750 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
28760 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
28770 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e  hildPages(pParen
28780 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
28790 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
287a0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
287b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e  .  /*.  ** Balan
287c0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
287d0 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ge.  Note that t
287e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
287f0 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20  (pPage) might.  
28800 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ** have been add
28810 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
28820 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  st so it might n
28830 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74  o longer be init
28840 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75  ialized..  ** Bu
28850 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
28860 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
28870 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
28880 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
28890 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
288a0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
288b0 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20  Parent, 0);.  . 
288c0 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
288d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
288e0 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
288f0 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
28900 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b  e3_free(apCell);
28910 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
28920 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
28930 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
28940 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
28950 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
28960 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
28970 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
28980 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
28990 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
289a0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
289b0 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
289c0 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
289d0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
289e0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
289f0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
28a00 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
28a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28a20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28a30 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
28a40 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
28a50 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
28a60 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
28a70 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
28a80 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
28a90 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
28aa0 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
28ab0 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
28ac0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
28ad0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
28ae0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
28af0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
28b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28b10 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
28b20 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
28b30 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28b50 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
28b60 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
28b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28b90 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
28ba0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
28bb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
28be0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
28bf0 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
28c00 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
28c10 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
28c20 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
28c30 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
28c40 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
28c50 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
28c60 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
28c70 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
28c80 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ca0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
28cb0 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
28cc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
28cd0 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
28ce0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
28cf0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
28d00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28d10 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28d20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42  ->mutex) );.  pB
28d30 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
28d40 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
28d50 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
28d60 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
28d70 65 33 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c  e3_malloc( mxCel
28d80 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66  lPerPage*(sizeof
28d90 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74  (u8*)+sizeof(int
28da0 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65  )) );.  if( apCe
28db0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
28dc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73  QLITE_NOMEM;.  s
28dd0 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61  zCell = (int*)&a
28de0 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50  pCell[mxCellPerP
28df0 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67  age];.  if( pPag
28e00 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
28e10 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63  * The table is c
28e20 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
28e30 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42  */.    TRACE(("B
28e40 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61  ALANCE: empty ta
28e50 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ble %d\n", pPage
28e60 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
28e70 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  e{.    /* The ro
28e80 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
28e90 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69   but has one chi
28ea0 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ld.  Transfer th
28eb0 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  e.    ** informa
28ec0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f  tion from that o
28ed0 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68  ne child into th
28ee0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69  e root page if i
28ef0 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66  t .    ** will f
28f00 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  it.  This reduce
28f10 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  s the depth of t
28f20 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a  he tree by one..
28f30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
28f40 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
28f50 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73  s page 1, it has
28f60 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69   less space avai
28f70 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a  lable than.    *
28f80 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65  * its child (due
28f90 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65   to the 100 byte
28fa0 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63   header that occ
28fb0 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  urs at the begin
28fc0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ning.    ** of t
28fd0 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29  he database fle)
28fe0 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  , so it might no
28ff0 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c  t be able to hol
29000 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20  d all of the .  
29010 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
29020 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
29030 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c  ined in the chil
29040 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  d.  If this is t
29050 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c  he .    ** case,
29060 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20   then do not do 
29070 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c  the transfer.  L
29080 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74  eave page 1 empt
29090 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  y except.    ** 
290a0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
290b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69  inter to the chi
290c0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68  ld page.  The ch
290d0 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ild page becomes
290e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74  .    ** the virt
290f0 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  ual root of the 
29100 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
29110 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
29120 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
29130 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
29140 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
29150 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e  sert( pgnoChild>
29160 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
29170 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69   pgnoChild<=sqli
29180 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
29190 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  t(pPage->pBt->pP
291a0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
291b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
291c0 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74  tPage(pPage->pBt
291d0 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
291e0 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66  hild, 0);.    if
291f0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
29200 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
29210 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
29220 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
29230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
29240 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
29250 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20  d, pPage);.     
29260 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
29270 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
29280 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ce;.      assert
29290 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
292a0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  low==0 );.      
292b0 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65  if( pChild->nFre
292c0 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  e>=100 ){.      
292d0 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69    /* The child i
292e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20  nformation will 
292f0 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  fit on the root 
29300 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a  page, so do the.
29310 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20          ** copy 
29320 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
29330 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61  ;.        zeroPa
29340 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
29350 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
29360 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
29370 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
29380 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
29390 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43  pCell[i] = findC
293a0 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20  ell(pChild,i);. 
293b0 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
293c0 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
293d0 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b  (pChild, apCell[
293e0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
293f0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50         assembleP
29400 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
29410 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c  d->nCell, apCell
29420 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20  , szCell);.     
29430 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72     /* Copy the r
29440 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20  ight-pointer of 
29450 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65  the child to the
29460 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
29470 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
29480 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
29490 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
294a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
294b0 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61  4byte(&pChild->a
294c0 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72  Data[pChild->hdr
294d0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
294e0 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
294f0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54  hild);.        T
29500 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29510 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65  child %d transfe
29520 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20  r to page 1\n", 
29530 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
29540 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29550 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
29560 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72  d has more infor
29570 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
29580 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
29590 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
295a0 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79   tree is already
295b0 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e   balanced.  Do n
295c0 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  othing. */.     
295d0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
295e0 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c  CE: child %d wil
295f0 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67  l not fit on pag
29600 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
29610 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pgno));.      }.
29620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29630 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61   memcpy(pPage->a
29640 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Data, pChild->aD
29650 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  ata, pPage->pBt-
29660 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
29670 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
29680 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  t = 0;.      pPa
29690 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
296a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
296b0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
296c0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
296d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
296e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
296f0 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
29700 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
29710 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66  "BALANCE: transf
29720 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f  er child %d into
29730 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20   root %d\n",.   
29740 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c             pChil
29750 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e  d->pgno, pPage->
29760 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
29770 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
29780 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65 29  hildPages(pPage)
29790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
297a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
297b0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
297c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
297d0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
297e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
297f0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
29800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
29810 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
29820 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70   .        rc = p
29830 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61  trmapPutOvfl(pPa
29840 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ge, i);.        
29850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29860 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
29870 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
29880 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20  balance;.       
29890 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
298a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65  .#endif.    rele
298b0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
298c0 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77  .  }.end_shallow
298d0 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69  _balance:.  sqli
298e0 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
298f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29900 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  .../*.** The roo
29910 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  t page is overfu
29920 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ll.**.** When th
29930 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61  is happens, Crea
29940 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  te a new child p
29950 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65  age and copy the
29960 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
29970 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68  the root into th
29980 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d  e child.  Then m
29990 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  ake the root.** 
299a0 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61  page an empty pa
299b0 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69  ge with rightChi
299c0 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ld pointing to t
299d0 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e  he new.** child.
299e0 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c     Finally, call
299f0 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61   balance_interna
29a00 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63  l() on the new c
29a10 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65  hild.** to cause
29a20 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f   it to split..*/
29a30 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
29a40 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61  nce_deeper(MemPa
29a50 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
29a60 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29a70 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
29a80 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
29a90 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
29aa0 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a  e *pChild;    /*
29ab0 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
29ac0 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
29ad0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
29ae0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75  ;     /* Page nu
29af0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
29b00 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
29b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
29b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
29b30 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
29b40 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  bleSize;     /* 
29b50 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a  Total usable siz
29b60 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20  e of a page */. 
29b70 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
29b80 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
29b90 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
29ba0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74  ge */.  u8 *cdat
29bb0 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  a;          /* C
29bc0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68  ontent of the ch
29bd0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ild page */.  in
29be0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
29bf0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70    /* Offset to p
29c00 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61  age header in pa
29c10 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72  rent */.  int br
29c20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
29c30 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65   Offset to conte
29c40 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  nt of first cell
29c50 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20   in parent */.. 
29c60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29c70 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
29c80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29c90 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
29ca0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
29cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29cc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29cd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29ce0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
29cf0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68  eePage(pBt, &pCh
29d00 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c  ild, &pgnoChild,
29d10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29   pPage->pgno, 0)
29d20 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
29d30 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
29d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
29d50 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
29d60 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29d70 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
29d80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
29d90 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
29da0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
29db0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
29dc0 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28   brk = get2byte(
29dd0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
29de0 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
29df0 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
29e00 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
29e10 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
29e20 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
29e30 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
29e40 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c  cpy(&cdata[brk],
29e50 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
29e60 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20  bleSize-brk);.  
29e70 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
29e80 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
29e90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29ea0 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
29eb0 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   pPage);.  if( r
29ec0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
29ed0 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65  deeper_out;.  me
29ee0 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
29ef0 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  fl, pPage->aOvfl
29f00 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  , pPage->nOverfl
29f10 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  ow*sizeof(pPage-
29f20 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
29f30 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
29f40 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
29f50 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c  low;.  if( pChil
29f60 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
29f70 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65      pChild->nFre
29f80 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
29f90 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65  ert( pChild->nCe
29fa0 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ll==pPage->nCell
29fb0 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
29fc0 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
29fd0 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
29fe0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
29ff0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2a000 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2a010 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ], pgnoChild);. 
2a020 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2a030 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
2a040 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  nto %d\n", pPage
2a050 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
2a060 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20  pgno));.#ifndef 
2a070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a080 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
2a090 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2a0a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72      int i;.    r
2a0b0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2a0c0 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c  t, pChild->pgno,
2a0d0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2a0e0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
2a0f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2a100 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2a110 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2a120 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2a130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
2a140 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2a150 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20  Child, i);.     
2a160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2a180 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2a190 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a1a0 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  f.  rc = balance
2a1b0 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29  _nonroot(pChild)
2a1c0 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72  ;..balancedeeper
2a1d0 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2a1e0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72  age(pChild);.  r
2a1f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a200 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65  ** Decide if the
2a210 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64   page pPage need
2a220 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
2a230 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20  .  If balancing 
2a240 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  is.** required, 
2a250 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72  call the appropr
2a260 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72  iate balancing r
2a270 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
2a280 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
2a290 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2a2a0 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74  t insert){.  int
2a2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a2c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a2d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a2e0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a2f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2a300 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
2a310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a320 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2a330 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2a340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a350 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
2a360 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
2a370 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
2a380 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  per(pPage);.    
2a390 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2a3a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2a3b0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
2a3c0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2a3d0 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65  _shallower(pPage
2a3e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2a3f0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
2a400 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  >nOverflow>0 || 
2a410 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72  .        (!inser
2a420 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  t && pPage->nFre
2a430 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  e>pPage->pBt->us
2a440 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b  ableSize*2/3) ){
2a450 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2a460 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67  nce_nonroot(pPag
2a470 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2a480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a490 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a4a0 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73   checks all curs
2a4b0 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ors that point t
2a4c0 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74  o table pgnoRoot
2a4d0 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ..** If any of t
2a4e0 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72  hose cursors wer
2a4f0 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
2a500 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66  Flag==0 in a dif
2a510 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  ferent.** databa
2a520 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61  se connection (a
2a530 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a540 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73  tion that shares
2a550 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61   the pager.** ca
2a560 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72  che with the cur
2a570 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  rent connection)
2a580 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20   and that other 
2a590 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69  connection .** i
2a5a0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61  s not in the Rea
2a5b0 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74  dUncommmitted st
2a5c0 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ate, then this r
2a5d0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a  outine returns .
2a5e0 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ** SQLITE_LOCKED
2a5f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74  ..**.** In addit
2a600 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20  ion to checking 
2a610 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28  for read-locks (
2a620 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  where a read-loc
2a630 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75  k .** means a cu
2a640 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68  rsor opened with
2a650 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73   wrFlag==0) this
2a660 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f   routine also mo
2a670 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65  ves.** all write
2a680 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74   cursors so that
2a690 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
2a6a0 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69  ng to the .** fi
2a6b0 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20  rst Cell on the 
2a6c0 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73  root page.  This
2a6d0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
2a6e0 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20  cause an insert 
2a6f0 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69  .** or delete mi
2a700 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e  ght change the n
2a710 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
2a720 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65  n a page or dele
2a730 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74  te.** a page ent
2a740 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20  irely and we do 
2a750 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76  not want to leav
2a760 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a  e any cursors .*
2a770 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f  * pointing to no
2a780 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65 73  n-existant pages
2a790 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74   or cells..*/.st
2a7a0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
2a7b0 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  adLocks(Btree *p
2a7c0 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  Btree, Pgno pgno
2a7d0 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
2a7e0 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43  pExclude){.  BtC
2a7f0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
2a800 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
2a810 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74  ee->pBt;.  sqlit
2a820 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d  e3 *db = pBtree-
2a830 3e 70 53 71 6c 69 74 65 3b 0a 20 20 61 73 73 65  >pSqlite;.  asse
2a840 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2a850 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
2a860 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  e) );.  for(p=pB
2a870 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
2a880 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
2a890 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20  if( p==pExclude 
2a8a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2a8b0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2a8c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2a8d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2a8e0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e  p->pgnoRoot!=pgn
2a8f0 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65  oRoot ) continue
2a900 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
2a910 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  lag==0 ){.      
2a920 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
2a930 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53   = p->pBtree->pS
2a940 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28  qlite;.      if(
2a950 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20   dbOther==0 ||. 
2a960 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72          (dbOther
2a970 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
2a980 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2a990 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2a9a0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
2a9b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2a9c0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
2a9d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
2a9e0 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e  pPage->pgno!=p->
2a9f0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
2aa00 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b    moveToRoot(p);
2aa10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2aa20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2aa30 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2aa40 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
2aa50 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
2aa60 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
2aa70 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
2aa80 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
2aa90 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
2aaa0 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
2aab0 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
2aac0 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
2aad0 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
2aae0 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
2aaf0 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
2ab00 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2ab10 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2ab20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2ab30 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
2ab40 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
2ab50 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
2ab60 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
2ab70 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
2ab80 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
2ab90 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
2aba0 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
2abb0 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
2abc0 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
2abd0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
2abe0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
2abf0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2ac00 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2ac10 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
2ac20 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
2ac30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2ac40 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2ac50 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2ac60 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2ac70 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
2ac80 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
2ac90 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
2aca0 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
2acb0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
2acc0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
2acd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ace0 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
2acf0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2ad00 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
2ad10 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
2ad20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ad30 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
2ad40 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
2ad50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2ad60 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
2ad70 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  New;.  MemPage *
2ad80 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
2ad90 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2ada0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2adb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
2adc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
2add0 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
2ade0 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
2adf0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2ae00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2ae10 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
2ae20 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2ae30 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
2ae40 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
2ae50 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2ae60 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
2ae70 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  n insert */.    
2ae80 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2ae90 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2aea0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2aeb0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2aec0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2aed0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2aee0 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d   );.  if( !pCur-
2aef0 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
2af00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2af10 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  M;   /* Cursor n
2af20 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  ot open for writ
2af30 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2af40 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2af50 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2af60 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2af70 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ur) ){.    retur
2af80 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2af90 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2afa0 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2afb0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2afc0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2afd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2afe0 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
2aff0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
2b000 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2b010 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2b020 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2b030 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
2b040 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75  ble */.  clearCu
2b050 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b060 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53  r);.  if( .    S
2b070 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2b080 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2b090 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2b0a0 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20  ot, pCur)) ||.  
2b0b0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
2b0c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2b0d0 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
2b0e0 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
2b0f0 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  as, &loc)).  ){.
2b100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b110 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2b120 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2b130 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2b140 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
2b150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b160 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
2b170 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
2b180 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
2b190 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
2b1a0 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
2b1b0 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
2b1c0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2b1d0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
2b1e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
2b1f0 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
2b200 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
2b210 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
2b220 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b230 69 73 49 6e 69 74 20 29 3b 0a 20 20 6e 65 77 43  isInit );.  newC
2b240 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
2b250 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  lloc( MX_CELL_SI
2b260 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28  ZE(pBt) );.  if(
2b270 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
2b280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b290 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
2b2a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
2b2b0 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
2b2c0 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
2b2d0 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
2b2e0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2b2f0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
2b300 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
2b310 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
2b320 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
2b330 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
2b340 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2b350 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
2b360 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2b370 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2b380 20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20     int szOld;.  
2b390 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b3a0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
2b3b0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
2b3c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2b3d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b3e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2b3f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2b400 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
2b410 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ert;.    }.    o
2b420 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
2b430 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2b440 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2b450 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b460 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2b470 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2b480 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2b490 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2b4a0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2b4b0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2b4c0 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2b4d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b4e0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2b4f0 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2b500 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2b510 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
2b520 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
2b530 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
2b540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b550 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
2b560 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
2b570 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2b580 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2b590 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b5a0 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
2b5b0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2b5c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b5d0 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
2b5e0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2b5f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2b600 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2b610 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2b620 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71  age, 1);.  /* sq
2b630 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75  lite3BtreePageDu
2b640 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43  mp(pCur->pBt, pC
2b650 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ur->pgnoRoot, 1)
2b660 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68  ; */.  /* fflush
2b670 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69  (stdout); */.  i
2b680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b690 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2b6a0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
2b6b0 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69  d_insert:.  sqli
2b6c0 74 65 33 5f 66 72 65 65 28 6e 65 77 43 65 6c 6c  te3_free(newCell
2b6d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2b6f0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2b700 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2b710 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2b720 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2b730 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2b740 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2b750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b760 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2b770 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2b780 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2b790 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73  ur->pPage;.  uns
2b7a0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2b7b0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2b7c0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2b7d0 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2b7e0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2b7f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2b800 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2b810 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2b820 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2b830 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2b840 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2b850 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2b860 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2b870 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2b880 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2b890 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2b8a0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2b8b0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2b8c0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2b8d0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2b8e0 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2b8f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2b900 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2b910 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2b920 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2b930 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2b940 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2b950 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2b960 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2b970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b980 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2b990 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2b9a0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2b9b0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2b9c0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2b9d0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2b9e0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2b9f0 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2ba00 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2ba10 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2ba20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2ba30 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2ba40 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2ba50 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2ba60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2ba70 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2ba80 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2ba90 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2baa0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
2bab0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
2bac0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2bad0 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  n (a no-op if th
2bae0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2baf0 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f  in .  ** CURSOR_
2bb00 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2bb10 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20  e) and save the 
2bb20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2bb30 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a   other cursors .
2bb40 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65    ** open on the
2bb50 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65   same table. The
2bb60 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  n call sqlite3Pa
2bb70 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
2bb80 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74  e page.  ** that
2bb90 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20   the entry will 
2bba0 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e  be deleted from.
2bbb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
2bbc0 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72   (rc = restoreOr
2bbd0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2bbe0 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
2bbf0 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2bc00 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2bc10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2bc20 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2bc30 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2bc40 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2bc50 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2bc60 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2bc70 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2bc80 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2bc90 20 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c   it's page and l
2bca0 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74  eave pCell point
2bcb0 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ing to the.  ** 
2bcc0 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43  data. The clearC
2bcd0 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73  ell() call frees
2bce0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2bcf0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2bd00 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ith the.  ** cel
2bd10 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65  l. The cell itse
2bd20 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61  lf is still inta
2bd30 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c  ct..  */.  pCell
2bd40 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2bd50 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2bd60 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2bd70 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
2bd80 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
2bd90 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
2bda0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2bdb0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
2bdc0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2bdd0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
2bde0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2bdf0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
2be00 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
2be10 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
2be20 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
2be30 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
2be40 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
2be50 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
2be60 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
2be70 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
2be80 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
2be90 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
2bea0 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
2beb0 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
2bec0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
2bed0 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
2bee0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
2bef0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2bf00 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
2bf10 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
2bf20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
2bf30 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
2bf40 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
2bf50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2bf60 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Next;.    int sz
2bf70 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  Next;  /* The co
2bf80 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69  mpiler warning i
2bf90 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20  s wrong: szNext 
2bfa0 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20  is always .     
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2bfc0 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
2bfd0 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61  e use.  Adding a
2bfe0 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  n extra initiali
2bff0 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  zation.         
2c000 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69          ** to si
2c010 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c  lence the compil
2c020 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68  er slows down th
2c030 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  e code. */.    i
2c040 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
2c050 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
2c060 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
2c070 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
2c080 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20  >leafData );.   
2c090 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2c0a0 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2c0b0 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2c0c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c0d0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2c0e0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2c0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c100 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2c110 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c120 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2c130 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2c140 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
2c160 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2c170 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2c180 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2c190 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2c1a0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2c1b0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2c1c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c  , pPage->pgno, l
2c1d0 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67  eafCur.pPage->pg
2c1e0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2c1f0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c200 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c210 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c220 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
2c230 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75   findCell(leafCu
2c240 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c250 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e  .idx);.      szN
2c260 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2c270 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  r(leafCur.pPage,
2c280 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2c290 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2c2a0 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2c2b0 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  +4 );.      temp
2c2c0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cell = sqlite3_m
2c2d0 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53  alloc( MX_CELL_S
2c2e0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  IZE(pBt) );.    
2c2f0 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
2c300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2c310 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c330 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c340 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c350 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2c360 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70  ge, pCur->idx, p
2c370 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
2c380 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
2c390 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c3a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c3b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2c3c0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2c3d0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2c3e0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2c3f0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c400 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
2c410 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2c420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c430 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75   dropCell(leafCu
2c440 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c450 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  .idx, szNext);. 
2c460 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2c470 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  e(leafCur.pPage,
2c480 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2c490 71 6c 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70  qlite3_free(temp
2c4a0 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Cell);.    sqlit
2c4b0 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
2c4c0 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75  mpCursor(&leafCu
2c4d0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2c4e0 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2c4f0 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2c500 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2c510 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ,.       pCur->p
2c520 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2c530 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70  pgno));.    drop
2c540 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c550 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c560 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c570 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  );.    rc = bala
2c580 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2c590 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2c5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2c5b0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2c5c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c5d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2c5e0 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
2c5f0 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
2c600 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
2c610 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
2c620 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2c630 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
2c640 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
2c650 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
2c660 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
2c670 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
2c680 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
2c690 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
2c6a0 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
2c6b0 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
2c6c0 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
2c6d0 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
2c6e0 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
2c6f0 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
2c700 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
2c710 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
2c720 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
2c730 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
2c740 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
2c750 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
2c760 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
2c770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2c780 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2c790 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2c7a0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2c7b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2c7c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
2c7d0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2c7e0 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
2c7f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2c800 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2c810 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2c820 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2c830 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2c840 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2c850 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2c860 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
2c870 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2c880 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2c890 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2c8a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2c8b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2c8c0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2c8d0 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
2c8e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2c8f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2c900 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c910 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2c920 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2c930 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2c940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c950 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
2c960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2c970 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
2c980 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
2c990 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
2c9a0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2c9b0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
2c9c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c9d0 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
2c9e0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
2c9f0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
2ca00 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
2ca10 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
2ca20 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
2ca30 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
2ca40 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
2ca50 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
2ca60 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
2ca70 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
2ca80 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
2ca90 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
2caa0 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
2cab0 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
2cac0 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
2cad0 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
2cae0 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
2caf0 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
2cb00 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2cb10 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
2cb20 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
2cb30 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
2cb40 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2cb50 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
2cb60 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
2cb70 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2cb80 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
2cb90 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
2cba0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2cbb0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2cbc0 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
2cbd0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
2cbe0 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
2cbf0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2cc00 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2cc10 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
2cc20 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
2cc30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cc40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cc50 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
2cc60 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2cc70 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2cc80 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2cc90 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2cca0 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2ccb0 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2ccc0 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2ccd0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
2cce0 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2ccf0 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2cd00 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2cd10 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2cd20 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2cd30 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2cd40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2cd50 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2cd60 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2cd70 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2cd80 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2cd90 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2cda0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2cdb0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2cdc0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2cdd0 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2cde0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2cdf0 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2ce00 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2ce10 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2ce20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2ce30 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2ce40 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2ce50 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2ce60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ce70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ce80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ce90 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2cea0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2ceb0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2cec0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2ced0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2cee0 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2cef0 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2cf00 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2cf10 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2cf20 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2cf30 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2cf40 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2cf50 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2cf60 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2cf70 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2cf80 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2cf90 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2cfa0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2cfb0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2cfc0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2cfd0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2cfe0 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2cff0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2d000 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2d010 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2d020 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2d030 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2d040 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2d050 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2d060 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2d070 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2d080 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2d090 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2d0a0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2d0b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d0c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d0d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d0e0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2d0f0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2d100 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2d110 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2d120 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d130 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2d140 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2d150 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2d160 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2d170 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d180 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d190 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2d1b0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2d1c0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2d1d0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2d1e0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2d1f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d200 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2d210 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2d220 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d240 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d250 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d270 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2d280 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2d290 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2d2a0 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2d2b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d2c0 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
2d2d0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
2d2e0 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
2d2f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2d300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d330 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d340 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
2d350 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2d360 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2d370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d380 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d3a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d3b0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2d3c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2d3d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d3e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d3f0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d400 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2d420 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2d430 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2d440 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2d450 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2d460 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2d470 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2d480 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2d490 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2d4a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2d4b0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2d4c0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2d4d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2d4e0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d4f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d500 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2d510 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2d520 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2d530 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2d540 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2d550 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d560 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d570 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2d580 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2d590 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d5a0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2d5b0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2d5c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d5d0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2d5e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d5f0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d600 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2d610 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2d620 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2d630 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2d640 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2d650 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2d660 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2d670 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2d680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d690 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2d6a0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2d6b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2d6c0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2d6d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2d6e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2d6f0 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
2d700 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
2d710 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
2d720 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2d730 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2d740 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
2d750 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
2d760 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
2d770 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
2d780 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
2d790 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
2d7a0 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
2d7b0 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
2d7c0 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
2d7d0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2d7e0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
2d7f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2d800 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
2d810 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
2d820 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2d830 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
2d840 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2d850 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
2d860 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20  page.  NULL for 
2d870 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e  the root */.  in
2d880 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20  t freePageFlag  
2d890 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
2d8a0 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
2d8b0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2d8c0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
2d8d0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2d8e0 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
2d8f0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
2d900 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d910 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2d920 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71  );.  if( pgno>sq
2d930 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2d940 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2d950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d960 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d970 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2d980 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2d990 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2d9a0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  , pParent);.  if
2d9b0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2d9c0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2d9d0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
2d9e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2d9f0 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
2da00 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2da10 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
2da20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2da30 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2da40 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2da50 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
2da60 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2da70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2da80 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2da90 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2daa0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
2dab0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2dac0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2dad0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2dae0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2daf0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2db00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
2db10 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2db20 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2db30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2db40 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  8]), pPage->pPar
2db50 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ent, 1);.    if(
2db60 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2db70 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2db80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
2db90 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
2dba0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2dbb0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
2dbc0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
2dbd0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2dbe0 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
2dbf0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2dc00 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
2dc10 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
2dc20 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
2dc30 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
2dc40 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2dc50 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2dc60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2dc70 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2dc80 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
2dc90 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2dca0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
2dcb0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2dcc0 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
2dcd0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
2dce0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
2dcf0 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
2dd00 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2dd10 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
2dd20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
2dd30 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2dd40 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2dd50 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2dd60 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2dd70 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
2dd80 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
2dd90 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
2dda0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
2ddb0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
2ddc0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
2ddd0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2dde0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2ddf0 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e  nt iTable){.  in
2de00 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
2de10 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2de20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2de30 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
2de40 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2de50 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
2de60 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2de70 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2de80 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2de90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
2dea0 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
2deb0 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
2dec0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2ded0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
2dee0 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  o do */.  }else 
2def0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
2df00 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2df10 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
2df20 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e   0)) ){.    /* n
2df30 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
2df40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2df50 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2df60 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
2df70 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Table, 0, 0);.  
2df80 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
2df90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2dfa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dfb0 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  Erase all inform
2dfc0 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65  ation in a table
2dfd0 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f   and add the roo
2dfe0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
2dff0 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73  o.** the freelis
2e000 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20  t.  Except, the 
2e010 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e  root of the prin
2e020 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ciple table (the
2e030 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20   one on.** page 
2e040 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  1) is never adde
2e050 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2e060 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2e070 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
2e080 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
2e090 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
2e0a0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73  any open.** curs
2e0b0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2e0c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
2e0d0 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
2e0e0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74   and the page at
2e0f0 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74   iTable is not t
2e100 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20  he last.** root 
2e110 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2e120 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2e130 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2e140 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ge .** in the da
2e150 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2e160 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c  oved into the sl
2e170 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
2e180 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c  pied by.** iTabl
2e190 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20  e and that last 
2e1a0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2e1b0 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61  cupied by the la
2e1c0 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  st root page.** 
2e1d0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2e1e0 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64  freelist instead
2e1f0 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20   of iTable.  In 
2e200 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a  this say, all.**
2e210 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20   root pages are 
2e220 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69  kept at the begi
2e230 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
2e240 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
2e250 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72  h.** is necessar
2e260 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d  y for AUTOVACUUM
2e270 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20   to work right. 
2e280 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
2e290 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   to the .** page
2e2a0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65   number that use
2e2b0 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74  d to be the last
2e2c0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2e2d0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a  e file before.**
2e2e0 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e   the move.  If n
2e2f0 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65  o page gets move
2e300 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  d, *piMoved is s
2e310 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20  et to 0..** The 
2e320 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2e330 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65  s recorded in me
2e340 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61  ta[3] and the va
2e350 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33  lue of.** meta[3
2e360 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  ] is updated by 
2e370 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
2e380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
2e390 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
2e3a0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2e3b0 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
2e3c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2e3d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2e3e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2e3f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2e400 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2e410 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2e420 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   );.  if( p->inT
2e430 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2e440 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
2e450 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2e460 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2e470 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2e480 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
2e490 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20  illegal to drop 
2e4a0 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
2e4b0 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
2e4c0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
2e4d0 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
2e4e0 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
2e4f0 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
2e500 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
2e510 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74  eed to move anot
2e520 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  her root-page to
2e530 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74   fill a gap left
2e540 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a   by the deleted.
2e550 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20    ** root page. 
2e560 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
2e570 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73  r was using this
2e580 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
2e590 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75  would .  ** occu
2e5a0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
2e5b0 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
2e5c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e5d0 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  LOCKED;.  }..  r
2e5e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e5f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  GetPage(pBt, (Pg
2e600 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67  no)iTable, &pPag
2e610 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  e, 0);.  if( rc 
2e620 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
2e630 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e640 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
2e650 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20  able);.  if( rc 
2e660 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2e670 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2e680 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e690 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a   *piMoved = 0;..
2e6a0 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29    if( iTable>1 )
2e6b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2e6c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2e6d0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2e6e0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2e6f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e700 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
2e710 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2e720 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61  ){.      Pgno ma
2e730 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2e740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e750 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2e760 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
2e770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e790 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2e7a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2e7b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2e7c0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
2e7d0 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
2e7e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2e7f0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2e800 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
2e810 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
2e820 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2e830 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2e840 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2e850 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
2e860 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
2e870 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
2e880 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2e890 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2e8a0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2e8b0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e8c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e8e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2e910 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2e920 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
2e930 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
2e940 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2e950 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2e960 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2e970 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
2e980 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
2e990 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2e9a0 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2e9b0 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
2e9c0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
2e9d0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2e9e0 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
2e9f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2ea00 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2ea10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2ea20 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
2ea30 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
2ea40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ea50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ea60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2ea70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2ea80 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2ea90 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f  atePage(pBt, pMo
2eaa0 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ve, PTRMAP_ROOTP
2eab0 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b  AGE, 0, iTable);
2eac0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ead0 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2eae0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2eaf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2eb00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2eb10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eb20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2eb30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
2eb40 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
2eb50 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
2eb60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2eb70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2eb80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2eb90 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2eba0 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
2ebb0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2ebc0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2ebd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ebe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ebf0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ec00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ec10 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
2ec20 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2ec30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
2ec40 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
2ec50 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
2ec60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
2ec70 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
2ec80 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
2ec90 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
2eca0 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
2ecb0 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
2ecc0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
2ecd0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
2ece0 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
2ecf0 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
2ed00 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2ed10 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
2ed20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
2ed30 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
2ed40 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
2ed50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2ed60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
2ed70 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2ed80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ed90 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
2eda0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2edb0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
2edc0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2edd0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2ede0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
2edf0 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
2ee00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ee10 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
2ee20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2ee30 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
2ee40 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
2ee50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2ee60 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2ee70 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
2ee80 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2ee90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
2eea0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
2eeb0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2eec0 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
2eed0 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
2eee0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2eef0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
2ef00 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
2ef10 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2ef20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ef30 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
2ef40 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
2ef50 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
2ef60 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
2ef70 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
2ef80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2ef90 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
2efa0 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
2efb0 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
2efc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2efd0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2efe0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2eff0 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
2f000 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
2f010 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2f020 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2f030 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
2f040 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
2f050 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
2f060 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
2f070 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
2f080 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
2f090 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
2f0a0 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
2f0b0 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
2f0c0 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
2f0d0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
2f0e0 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
2f0f0 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
2f100 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
2f110 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
2f120 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
2f130 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
2f140 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
2f150 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
2f160 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
2f170 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
2f180 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
2f190 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
2f1a0 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
2f1b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f1c0 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
2f1d0 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
2f1e0 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
2f1f0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74   *pDbPage;.  int
2f200 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2f210 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
2f220 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2f230 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
2f240 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  treeEnter(p);.. 
2f250 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65   /* Reading a me
2f260 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65  ta-data value re
2f270 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
2f280 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e  ck on page 1 (an
2f290 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65  d hence.  ** the
2f2a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2f2b0 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68  able. We grab th
2f2c0 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65  is lock regardle
2f2d0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2f2e0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51  .  ** not the SQ
2f2f0 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2f300 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
2f310 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74   (the table root
2f320 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20  ed at page.  ** 
2f330 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  1 is treated as 
2f340 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62  a special case b
2f350 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  y queryTableLock
2f360 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65  () and lockTable
2f370 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ())..  */.  rc =
2f380 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2f390 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2f3a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2f3b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2f3c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2f3d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2f3e0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
2f3f0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d   idx>=0 && idx<=
2f400 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  15 );.  rc = sql
2f410 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
2f420 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44  ->pPager, 1, &pD
2f430 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2f440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
2f450 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2f460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2f470 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e  .  pP1 = (unsign
2f480 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
2f490 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2f4a0 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61  bPage);.  *pMeta
2f4b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
2f4c0 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20  [36 + idx*4]);. 
2f4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2f4e0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ef(pDbPage);..  
2f4f0 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
2f500 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
2f510 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
2f520 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
2f530 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
2f540 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
2f550 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
2f560 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
2f570 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
2f580 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2f590 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2f5a0 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
2f5b0 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
2f5c0 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
2f5d0 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
2f5e0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
2f5f0 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
2f600 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
2f610 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73   READ_LOCK);.  s
2f620 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f630 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2f640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
2f650 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2f660 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
2f670 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
2f680 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
2f690 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
2f6a0 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
2f6b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
2f6c0 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
2f6d0 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
2f6e0 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
2f6f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2f700 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2f710 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
2f720 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
2f730 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
2f740 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
2f750 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
2f760 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2f770 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
2f780 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2f790 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2f7a0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2f7b0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
2f7c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
2f7d0 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  ge1!=0 );.    pP
2f7e0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
2f7f0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
2f800 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f810 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2f820 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2f830 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f840 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2f850 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
2f860 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 20 20  4], iMeta);.    
2f870 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a    if( idx==7 ){.
2f880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f890 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f8a0 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20  || iMeta==0 );. 
2f8b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2f8c0 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
2f8d0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
2f8e0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
2f8f0 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a   iMeta;.      }.
2f900 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2f910 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2f920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f930 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2f940 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20  he flag byte at 
2f950 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2f960 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
2f970 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2f980 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2f990 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
2f9a0 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28  lite3BtreeFlags(
2f9b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2f9c0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2f9d0 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45   about CURSOR_RE
2f9e0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f  QUIRESEEK state?
2f9f0 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74   Probably need t
2fa00 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74  o call.  ** rest
2fa10 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2fa20 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
2fa30 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
2fa40 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2fa50 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2fa60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2fa70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2fa80 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d  rt( pPage->pBt==
2fa90 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72  pCur->pBt );.  r
2faa0 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
2fab0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2fac0 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
2fad0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2fae0 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73  rn the pager ass
2faf0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42  ociated with a B
2fb00 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Tree.  This rout
2fb10 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ine is used for.
2fb20 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2fb30 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2fb40 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  /.Pager *sqlite3
2fb50 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65  BtreePager(Btree
2fb60 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
2fb70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d  ->pBt->pPager;.}
2fb80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2fb90 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2fba0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65  CHECK./*.** Appe
2fbb0 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20  nd a message to 
2fbc0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2fbd0 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
2fbe0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70  tic void checkAp
2fbf0 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67  pendMsg(.  Integ
2fc00 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a  rityCk *pCheck,.
2fc10 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20    char *zMsg1,. 
2fc20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2fc30 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  rmat,.  ....){. 
2fc40 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2fc50 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66  har *zMsg2;.  if
2fc60 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  ( !pCheck->mxErr
2fc70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68   ) return;.  pCh
2fc80 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20  eck->mxErr--;.  
2fc90 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a  pCheck->nErr++;.
2fca0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2fcb0 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32  Format);.  zMsg2
2fcc0 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
2fcd0 74 66 28 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  tf(0, zFormat, a
2fce0 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2fcf0 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30  ;.  if( zMsg1==0
2fd00 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20   ) zMsg1 = "";. 
2fd10 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72   if( pCheck->zEr
2fd20 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
2fd30 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d   *zOld = pCheck-
2fd40 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43  >zErrMsg;.    pC
2fd50 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  heck->zErrMsg = 
2fd60 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
2fd70 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
2fd80 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20  >zErrMsg, zOld, 
2fd90 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  "\n", zMsg1, zMs
2fda0 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
2fdb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2fdc0 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOld);.  }else{.
2fdd0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2fde0 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45  ring(&pCheck->zE
2fdf0 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d  rrMsg, zMsg1, zM
2fe00 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sg2, (char*)0);.
2fe10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2fe20 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e  ee(zMsg2);.}.#en
2fe30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2fe40 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2fe50 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
2fe60 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2fe70 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
2fe80 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
2fe90 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
2fea0 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
2feb0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
2fec0 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
2fed0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
2fee0 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
2fef0 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
2ff00 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
2ff10 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
2ff20 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
2ff30 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2ff40 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
2ff50 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2ff60 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
2ff70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2ff80 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
2ff90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2ffa0 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
2ffb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2ffc0 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
2ffd0 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69  k *pCheck, int i
2ffe0 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
2fff0 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
30000 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
30010 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
30020 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69  heck->nPage || i
30030 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68  Page<0 ){.    ch
30040 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30050 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
30060 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  invalid page num
30070 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b  ber %d", iPage);
30080 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
30090 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d   }.  if( pCheck-
300a0 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31  >anRef[iPage]==1
300b0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
300c0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
300d0 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65  Context, "2nd re
300e0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
300f0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30100 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
30110 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b   return  (pCheck
30120 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b  ->anRef[iPage]++
30130 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  )>1;.}..#ifndef 
30140 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30150 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65  VACUUM./*.** Che
30160 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ck that the entr
30170 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
30180 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43  -map for page iC
30190 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a  hild maps to .**
301a0 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70   page iParent, p
301b0 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54  ointer type ptrT
301c0 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70  ype. If not, app
301d0 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  end an error mes
301e0 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63  sage.** to pChec
301f0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
30200 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20  d checkPtrmap(. 
30210 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
30220 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67  heck,   /* Integ
30230 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65  rity check conte
30240 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  xt */.  Pgno iCh
30250 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ild,           /
30260 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  * Child page num
30270 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ber */.  u8 eTyp
30280 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
30290 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
302a0 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a  ter map type */.
302b0 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20    Pgno iParent, 
302c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
302d0 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
302e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
302f0 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
30300 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
30310 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72  /* Context descr
30320 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72  iption (used for
30330 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29   error msg) */.)
30340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38  {.  int rc;.  u8
30350 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20   ePtrmapType;.  
30360 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65  Pgno iPtrmapPare
30370 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d  nt;..  rc = ptrm
30380 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42  apGet(pCheck->pB
30390 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72  t, iChild, &ePtr
303a0 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61  mapType, &iPtrma
303b0 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
303c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
303d0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
303e0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
303f0 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f  text, "Failed to
30400 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79   read ptrmap key
30410 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20  =%d", iChild);. 
30420 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
30430 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70    if( ePtrmapTyp
30440 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72  e!=eType || iPtr
30450 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65  mapParent!=iPare
30460 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  nt ){.    checkA
30470 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30480 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
30490 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65    "Bad ptr map e
304a0 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65  ntry key=%d expe
304b0 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74  cted=(%d,%d) got
304c0 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20  =(%d,%d)", .    
304d0 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c    iChild, eType,
304e0 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61   iParent, ePtrma
304f0 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61  pType, iPtrmapPa
30500 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  rent);.  }.}.#en
30510 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
30520 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
30530 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f  f the freelist o
30540 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
30550 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56   page list..** V
30560 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
30570 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
30580 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e  n the list is N.
30590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
305a0 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74  checkList(.  Int
305b0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
305c0 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20  ,  /* Integrity 
305d0 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74  checking context
305e0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65   */.  int isFree
305f0 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  List,       /* T
30600 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69  rue for a freeli
30610 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f  st.  False for o
30620 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
30630 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  t */.  int iPage
30640 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30650 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
30660 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68  first page in th
30670 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
30680 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
30690 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
306a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
306b0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63   the list */.  c
306c0 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
306d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
306e0 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
306f0 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
30700 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64  ;.  int expected
30710 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72   = N;.  int iFir
30720 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68  st = iPage;.  wh
30730 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20  ile( N-- > 0 && 
30740 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b  pCheck->mxErr ){
30750 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76  .    DbPage *pOv
30760 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69  flPage;.    unsi
30770 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c  gned char *pOvfl
30780 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50  Data;.    if( iP
30790 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
307a0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
307b0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
307c0 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
307d0 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
307e0 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
307f0 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
30800 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
30810 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
30820 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
30830 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
30840 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
30850 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
30860 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
30870 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
30880 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  rGet(pCheck->pPa
30890 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
308a0 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b  , &pOvflPage) ){
308b0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
308c0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
308d0 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20  ontext, "failed 
308e0 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c  to get page %d",
308f0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62   iPage);.      b
30900 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
30910 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73  pOvflData = (uns
30920 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
30930 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
30940 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20  (pOvflPage);.   
30950 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20   if( isFreeList 
30960 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
30970 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30980 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Data[4]);.#ifnde
30990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
309a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
309b0 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
309c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
309d0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
309e0 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
309f0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30a00 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30a10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30a20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
30a30 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
30a40 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
30a50 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30a60 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30a70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
30a80 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
30a90 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
30aa0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30ab0 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
30ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30ad0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
30ae0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30af0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
30b00 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30b10 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Data[8+i*4]);.#i
30b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30b30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30b40 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
30b50 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
30b60 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
30b70 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
30b80 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
30b90 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30ba0 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30bc0 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
30bd0 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
30be0 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
30bf0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
30c00 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
30c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
30c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30c30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
30c40 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
30c50 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
30c60 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
30c70 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
30c80 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
30c90 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
30ca0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
30cb0 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
30cc0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
30cd0 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
30ce0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
30cf0 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
30d00 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
30d10 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
30d20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
30d30 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
30d40 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
30d50 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  flData);.       
30d60 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
30d70 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f  eck, i, PTRMAP_O
30d80 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c  VERFLOW2, iPage,
30d90 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
30da0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
30db0 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74  .    iPage = get
30dc0 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
30dd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
30de0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67  erUnref(pOvflPag
30df0 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
30e00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30e10 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
30e20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
30e30 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
30e40 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f  Y_CHECK./*.** Do
30e50 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20   various sanity 
30e60 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67  checks on a sing
30e70 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65  le page of a tre
30e80 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
30e90 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52  e tree depth.  R
30ea0 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e  oot pages return
30eb0 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20   0.  Parents of 
30ec0 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65  root pages.** re
30ed0 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66  turn 1, and so f
30ee0 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  orth..** .** The
30ef0 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f  se checks are do
30f00 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ne:.**.**      1
30f10 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
30f20 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65  t cells and free
30f30 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76  blocks do not ov
30f40 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20  erlap.**        
30f50 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f    but combine to
30f60 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65   completely cove
30f70 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20  r the page..**  
30f80 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72  NO  2.  Make sur
30f90 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20  e cell keys are 
30fa0 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f  in order..**  NO
30fb0 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    3.  Make sure 
30fc0 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  no key is less t
30fd0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
30fe0 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zLowerBound..** 
30ff0 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75   NO  4.  Make su
31000 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65  re no key is gre
31010 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
31020 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e  al to zUpperBoun
31030 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43  d..**      5.  C
31040 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
31050 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  ty of overflow p
31060 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e  ages..**      6.
31070 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61    Recursively ca
31080 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  ll checkTreePage
31090 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   on all children
310a0 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65  ..**      7.  Ve
310b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
310c0 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  pth of all child
310d0 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e  ren is the same.
310e0 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b  .**      8.  Mak
310f0 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65  e sure this page
31100 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25   is at least 33%
31110 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74   full or else it
31120 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
31130 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
31140 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
31150 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67  int checkTreePag
31160 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  e(.  IntegrityCk
31170 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f   *pCheck,  /* Co
31180 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61  ntext for the sa
31190 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20  nity check */.  
311a0 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
311b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
311c0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
311d0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d   to check */.  M
311e0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
311f0 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
31200 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  age */.  char *z
31210 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
31220 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
31230 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
31240 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
31250 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
31260 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
31270 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
31280 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
31290 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
312a0 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
312b0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
312c0 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
312d0 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
312e0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
312f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
31300 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
31310 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50   "Page %d: ", iP
31320 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  age);..  /* Chec
31330 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
31340 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42  exists.  */.  pB
31350 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b  t = pCheck->pBt;
31360 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
31370 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
31380 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20  .  if( iPage==0 
31390 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
313a0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
313b0 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e  k, iPage, zParen
313c0 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75  tContext) ) retu
313d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20  rn 0;.  if( (rc 
313e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
313f0 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
31400 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20  )iPage, &pPage, 
31410 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  0))!=0 ){.    ch
31420 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31430 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
31440 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
31450 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65   get the page. e
31460 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72  rror code=%d", r
31470 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  c);.    return 0
31480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20  ;.  }.  if( (rc 
31490 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
314a0 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
314b0 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20  arent))!=0 ){.  
314c0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
314d0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
314e0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
314f0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42         "sqlite3B
31500 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72  treeInitPage() r
31510 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64  eturns error cod
31520 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e %d", rc);.    
31530 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31540 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
31550 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
31560 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65  k out all the ce
31570 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74  lls..  */.  dept
31580 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
31590 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
315a0 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
315b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  r; i++){.    u8 
315c0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
315d0 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  sz;.    CellInfo
315e0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43   info;..    /* C
315f0 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65  heck payload ove
31600 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
31610 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
31620 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
31630 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
31640 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt,.            
31650 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25   "On tree page %
31660 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50  d cell %d: ", iP
31670 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65  age, i);.    pCe
31680 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
31690 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69  age,i);.    sqli
316a0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
316b0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
316c0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73  l, &info);.    s
316d0 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
316e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
316f0 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
31700 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73  nfo.nKey;.    as
31710 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e  sert( sz==info.n
31720 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69  Payload );.    i
31730 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  f( sz>info.nLoca
31740 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  l ){.      int n
31750 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66  Page = (sz - inf
31760 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c  o.nLocal + usabl
31770 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62  eSize - 5)/(usab
31780 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
31790 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
317a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
317b0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
317c0 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  w]);.#ifndef SQL
317d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
317e0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
317f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31800 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
31810 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
31820 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
31830 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20  ERFLOW1, iPage, 
31840 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31850 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31860 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b  checkList(pCheck
31870 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e  , 0, pgnoOvfl, n
31880 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31890 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
318a0 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c  heck sanity of l
318b0 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  eft child page..
318c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
318d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
318e0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
318f0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66  byte(pCell);.#if
31900 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31910 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31920 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31930 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
31940 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
31950 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
31960 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
31970 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31980 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31990 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61  d2 = checkTreePa
319a0 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70  ge(pCheck,pgno,p
319b0 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a  Page,zContext);.
319c0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
319d0 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20   d2!=depth ){.  
319e0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
319f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31a00 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61  ntext, "Child pa
31a10 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
31a20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
31a30 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20    depth = d2;.  
31a40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70    }.  }.  if( !p
31a50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31a60 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31a70 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
31a80 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31a90 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  +8]);.    sqlite
31aa0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31ab0 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
31ac0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
31ae0 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68   page %d at righ
31af0 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67  t child: ", iPag
31b00 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
31b10 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31b20 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
31b30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31b40 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31b50 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
31b60 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
31b70 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
31b80 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
31b90 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
31ba0 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74  no, pPage, zCont
31bb0 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ext);.  }. .  /*
31bc0 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
31bd0 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
31be0 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
31bf0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
31c00 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
31c10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
31c20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   hit = sqlite3Ma
31c30 6c 6c 6f 63 5a 65 72 6f 28 20 75 73 61 62 6c 65  llocZero( usable
31c40 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69  Size );.  if( hi
31c50 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
31c60 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65  hit, 1, get2byte
31c70 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b  (&data[hdr+5]));
31c80 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  .    nCell = get
31c90 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
31ca0 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61  3]);.    cellSta
31cb0 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  rt = hdr + 12 - 
31cc0 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
31cd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
31ce0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
31cf0 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
31d00 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61  te(&data[cellSta
31d10 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  rt+i*2]);.      
31d20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53  int size = cellS
31d30 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
31d40 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
31d50 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
31d60 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73   (pc+size-1)>=us
31d70 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30  ableSize || pc<0
31d80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31d90 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31da0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
31db0 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
31dc0 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
31dd0 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
31de0 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
31df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31e00 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b  for(j=pc+size-1;
31e10 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74   j>=pc; j--) hit
31e20 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
31e30 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74     }.    for(cnt
31e40 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26  =0, i=get2byte(&
31e50 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e  data[hdr+1]); i>
31e60 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a  0 && i<usableSiz
31e70 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20  e && cnt<10000; 
31e80 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  .           cnt+
31e90 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  +){.      int si
31ea0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
31eb0 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  ata[i+2]);.     
31ec0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
31ed0 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73  ( (i+size-1)>=us
31ee0 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20  ableSize || i<0 
31ef0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31f00 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31f10 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20  , 0,  .         
31f20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
31f30 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
31f40 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
31f50 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
31f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31f70 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20  for(j=i+size-1; 
31f80 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  j>=i; j--) hit[j
31f90 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
31fa0 20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28     i = get2byte(
31fb0 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d  &data[i]);.    }
31fc0 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30  .    for(i=cnt=0
31fd0 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20  ; i<usableSize; 
31fe0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
31ff0 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  hit[i]==0 ){.   
32000 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
32010 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b    }else if( hit[
32020 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  i]>1 ){.        
32030 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
32040 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20  Check, 0,.      
32050 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73      "Multiple us
32060 65 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f  es for byte %d o
32070 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69  f page %d", i, i
32080 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Page);.        b
32090 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
320a0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
320b0 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a  =data[hdr+7] ){.
320c0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
320d0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
320e0 0a 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67  .          "Frag
320f0 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20  mented space is 
32100 25 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64  %d byte reported
32110 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25   as %d on page %
32120 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e  d",.          cn
32130 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20  t, data[hdr+7], 
32140 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iPage);.    }.  
32150 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
32160 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73  (hit);..  releas
32170 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
32180 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a  return depth+1;.
32190 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
321a0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
321b0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
321c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
321d0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
321e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
321f0 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65  ne does a comple
32200 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20  te check of the 
32210 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65  given BTree file
32220 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a  .  aRoot[] is.**
32230 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67   an array of pag
32240 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20  es numbers were 
32250 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72  each page number
32260 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
32270 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e  e of.** a table.
32280 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e    nRoot is the n
32290 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
322a0 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   in aRoot..**.**
322b0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63   If everything c
322c0 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20  hecks out, this 
322d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
322e0 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68  NULL.  If someth
322f0 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c  ing is.** amiss,
32300 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
32310 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
32320 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
32330 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a  d from malloc().
32340 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ** and a pointer
32350 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d   to that error m
32360 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e  essage is return
32370 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ed.  The calling
32380 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
32390 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
323a0 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f  freeing the erro
323b0 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69  r message when i
323c0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68  t is done..*/.ch
323d0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
323e0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
323f0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
32400 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
32410 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
32420 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
32430 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
32440 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
32450 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
32460 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
32470 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
32480 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
32490 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
324a0 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
324b0 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
324c0 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
324d0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
324e0 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
324f0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
32500 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
32510 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  riable */.){.  i
32520 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
32530 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
32540 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
32550 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
32560 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
32570 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 52 65  eEnter(p);.  nRe
32580 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
32590 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
325a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63  ager);.  if( loc
325b0 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
325c0 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  p)!=SQLITE_OK ){
325d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
325e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
325f0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
32600 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
32610 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
32620 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32630 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
32640 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
32650 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
32660 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
32670 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71  Check.nPage = sq
32680 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
32690 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
326a0 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
326b0 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
326c0 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
326d0 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66   *pnErr = 0;.#if
326e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
326f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
32700 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30  ( pBt->nTrunc!=0
32710 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e   ){.    sCheck.n
32720 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Page = pBt->nTru
32730 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  nc;.  }.#endif. 
32740 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67   if( sCheck.nPag
32750 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  e==0 ){.    unlo
32760 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
32770 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
32780 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
32790 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
327a0 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
327b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
327c0 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65  c( (sCheck.nPage
327d0 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
327e0 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20  k.anRef[0]) );. 
327f0 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52   if( !sCheck.anR
32800 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  ef ){.    unlock
32810 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
32820 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d  t);.    *pnErr =
32830 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
32840 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32850 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32860 4d 50 72 69 6e 74 66 28 70 2d 3e 70 53 71 6c 69  MPrintf(p->pSqli
32870 74 65 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d  te, "Unable to m
32880 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c  alloc %d bytes",
32890 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63   .        (sChec
328a0 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
328b0 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
328c0 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ]));.  }.  for(i
328d0 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
328e0 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
328f0 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
32900 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
32910 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
32920 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
32930 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
32940 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
32950 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a  ;.  }.  sCheck.z
32960 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f  ErrMsg = 0;..  /
32970 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
32980 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
32990 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65  elist.  */.  che
329a0 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20  ckList(&sCheck, 
329b0 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74  1, get4byte(&pBt
329c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
329d0 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  32]),.          
329e0 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d    get4byte(&pBt-
329f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
32a00 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c  6]), "Main freel
32a10 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43  ist: ");..  /* C
32a20 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62  heck all the tab
32a30 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
32a40 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20  i=0; i<nRoot && 
32a50 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
32a60 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f  +){.    if( aRoo
32a70 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  t[i]==0 ) contin
32a80 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
32a90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32aa0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
32ab0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52  autoVacuum && aR
32ac0 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  oot[i]>1 ){.    
32ad0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73    checkPtrmap(&s
32ae0 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
32af0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
32b00 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
32b10 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
32b20 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c  reePage(&sCheck,
32b30 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c   aRoot[i], 0, "L
32b40 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74  ist of tree root
32b50 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s: ");.  }..  /*
32b60 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
32b70 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
32b80 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a  e is referenced.
32b90 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
32ba0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
32bb0 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
32bc0 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
32bd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32be0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68  CUUM.    if( sCh
32bf0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32c00 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32c10 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32c20 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
32c30 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
32c40 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
32c50 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
32c60 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
32c70 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73  o-vacuum, make s
32c80 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f  ure no tables co
32c90 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66  ntain.    ** ref
32ca0 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74  erences to point
32cb0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20  er-map pages..  
32cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68    */.    if( sCh
32cd0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32ce0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
32cf0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32d00 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75  )!=i || !pBt->au
32d10 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
32d20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32d30 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
32d40 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
32d50 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
32d60 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
32d70 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a  anRef[i]!=0 && .
32d80 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
32d90 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69  AGENO(pBt, i)==i
32da0 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   && pBt->autoVac
32db0 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
32dc0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
32dd0 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65  heck, 0, "Pointe
32de0 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73  r map page %d is
32df0 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29   referenced", i)
32e00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32e10 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
32e20 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  re this analysis
32e30 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61   did not leave a
32e40 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73  ny unref() pages
32e50 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74  .  */.  unlockBt
32e60 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
32e70 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20  ;.  if( nRef != 
32e80 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
32e90 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
32ea0 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  ) ){.    checkAp
32eb0 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32ec0 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73   0, .      "Outs
32ed0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75  tanding page cou
32ee0 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20  nt goes from %d 
32ef0 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69  to %d during thi
32f00 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20  s analysis",.   
32f10 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33     nRef, sqlite3
32f20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
32f30 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29  t->pPager).    )
32f40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
32f50 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74  n  up and report
32f60 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
32f70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
32f80 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
32f90 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65  free(sCheck.anRe
32fa0 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73  f);.  *pnErr = s
32fb0 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65  Check.nErr;.  re
32fc0 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72  turn sCheck.zErr
32fd0 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Msg;.}.#endif /*
32fe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
32ff0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
33000 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33010 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
33020 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
33030 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
33040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
33050 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
33060 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
33070 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
33080 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
33090 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
330a0 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
330b0 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
330c0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
330d0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
330e0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
330f0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
33100 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
33110 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
33120 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
33130 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
33140 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
33150 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
33160 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
33170 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
33180 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
33190 54 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  The pager direct
331a0 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61  ory name is inva
331b0 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
331c0 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
331d0 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
331e0 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
331f0 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
33200 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
33210 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
33220 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
33230 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33240 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33250 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
33260 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
33270 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
33280 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
33290 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
332a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
332b0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
332c0 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
332d0 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
332e0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
332f0 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
33300 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
33310 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
33320 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
33330 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
33340 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a  *.** The pager j
33350 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
33360 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
33370 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
33380 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
33390 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
333a0 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
333b0 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
333c0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
333d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
333e0 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65  ournalname(Btree
333f0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
33400 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
33410 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
33420 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
33430 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  lname(p->pBt->pP
33440 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ager);.}..#ifnde
33450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
33460 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  CUUM./*.** Copy 
33470 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
33480 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20  tent of pBtFrom 
33490 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74  into pBtTo.  A t
334a0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
334b0 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72  st be active for
334c0 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a   both files..**.
334d0 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66  ** The size of f
334e0 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20  ile pBtFrom may 
334f0 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68  be reduced by th
33500 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
33510 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
33520 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61  s wrong, the tra
33530 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46  nsaction on pBtF
33540 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  rom is rolled ba
33550 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
33560 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28  t btreeCopyFile(
33570 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65  Btree *pTo, Btre
33580 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74  e *pFrom){.  int
33590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
335a0 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65  .  Pgno i, nPage
335b0 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70  , nToPage, iSkip
335c0 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ;..  BtShared *p
335d0 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b  BtTo = pTo->pBt;
335e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
335f0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42  From = pFrom->pB
33600 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  t;..  if( pTo->i
33610 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
33620 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
33630 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
33640 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
33650 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
33660 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
33670 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  pCursor ) return
33680 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
33690 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65  nToPage = sqlite
336a0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
336b0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
336c0 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
336d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
336e0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
336f0 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
33700 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33710 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  tTo);.  for(i=1;
33720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33730 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29  & i<=nPage; i++)
33740 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33750 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33760 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33770 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33780 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33790 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c  From->pPager, i,
337a0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
337b0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
337c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
337d0 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 70  PagerOverwrite(p
337e0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
337f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33800 44 61 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a  Data(pDbPage));.
33810 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33820 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33830 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33840 20 66 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69   file is shrinki
33850 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20  ng, journal the 
33860 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 62  pages that are b
33870 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20  eing truncated. 
33880 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79   ** so that they
33890 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
338a0 61 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  ack if the commi
338b0 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  t fails..  */.  
338c0 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72  for(i=nPage+1; r
338d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
338e0 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29  i<=nToPage; i++)
338f0 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33900 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33910 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33920 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33930 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33940 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
33950 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33960 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33980 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
33990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
339a0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
339b0 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65  Page);.    /* Ye
339c0 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
339d0 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
339e0 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
339f0 74 65 72 20 57 72 69 74 65 28 29 2e 20 20 42 75  ter Write().  Bu
33a00 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33a10 20 62 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d   because the nam
33a20 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63  es of those proc
33a30 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78  edures do not ex
33a40 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65  actly .    ** re
33a50 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65  present what the
33a60 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72  y do.  Write() r
33a70 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74  eally means "put
33a80 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68   this page in th
33a90 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  e.    ** rollbac
33aa0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
33ab0 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
33ac0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
33ad0 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
33ae0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33af0 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44   file later."  D
33b00 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65  ontWrite() undoe
33b10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
33b20 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74  t of.    ** that
33b30 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68   and prevents th
33b40 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  e page from bein
33b50 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  g written to the
33b60 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a   database.  The.
33b70 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
33b80 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
33b90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
33ba0 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
33bb0 69 73 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20  is the whole.   
33bc0 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69   ** point of thi
33bd0 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70  s loop: to put p
33be0 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
33bf0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  back journal. */
33c00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
33c10 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
33c20 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26  .  }.  if( !rc &
33c30 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20  & nPage<nToPage 
33c40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
33c50 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
33c60 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
33c70 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  nPage);.  }..  i
33c80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
33c90 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
33ca0 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  k(pTo);.  }.  re
33cb0 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
33cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
33cd0 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
33ce0 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
33cf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
33d00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
33d10 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  To);.  sqlite3Bt
33d20 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b  reeEnter(pFrom);
33d30 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70  .  rc = btreeCop
33d40 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d  yFile(pTo, pFrom
33d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33d60 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20  eLeave(pFrom);. 
33d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
33d80 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72  ve(pTo);.  retur
33d90 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
33da0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
33db0 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
33dc0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
33dd0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
33de0 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
33df0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
33e00 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  sInTrans(Btree *
33e10 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  p){.  assert( p=
33e20 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
33e30 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c  tex_held(p->pSql
33e40 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
33e50 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
33e60 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
33e70 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a  _WRITE));.}../*.
33e80 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
33e90 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  ro if a statemen
33ea0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
33eb0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
33ec0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
33ed0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
33ee0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33ef0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
33f00 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  (p) );.  return 
33f10 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42  (p->pBt && p->pB
33f20 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  t->inStmt);.}../
33f30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
33f40 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28  zero if a read (
33f50 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
33f60 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
33f70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33f80 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
33f90 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  s(Btree *p){.  a
33fa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33fb0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71  utex_held(p->pSq
33fc0 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  lite->mutex) );.
33fd0 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
33fe0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
33ff0 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a  S_NONE));.}../*.
34000 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34010 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
34020 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20  er to a blob of 
34030 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
34040 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
34050 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  le shared-btree.
34060 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75   The memory is u
34070 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f  sed by client co
34080 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a  de for it's own.
34090 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72  ** purposes (for
340a0 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f   example, to sto
340b0 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20  re a high-level 
340c0 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65  schema associate
340d0 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73  d with .** the s
340e0 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68  hared-btree). Th
340f0 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61  e btree layer ma
34100 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20  nages reference 
34110 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e  counting issues.
34120 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
34130 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61   time this is ca
34140 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64  lled on a shared
34150 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62  -btree, nBytes b
34160 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
34170 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c  * are allocated,
34180 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74   zeroed, and ret
34190 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
341a0 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75  ler. For each su
341b0 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c  bsequent .** cal
341c0 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72  l the nBytes par
341d0 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
341e0 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  d and a pointer 
341f0 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62  to the same blob
34200 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  .** of memory re
34210 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a  turned. .**.** J
34220 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73  ust before the s
34230 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63  hared-btree is c
34240 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  losed, the funct
34250 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
34260 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75  e .** xFree argu
34270 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65  ment when the me
34280 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
34290 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f  was made is invo
342a0 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62  ked on the .** b
342b0 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  lob of allocated
342c0 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75   memory. This fu
342d0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
342e0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  t call sqlite3_f
342f0 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ree().** on the 
34300 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65  memory, the btre
34310 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61  e layer does tha
34320 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  t..*/.void *sqli
34330 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42  te3BtreeSchema(B
34340 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79  tree *p, int nBy
34350 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65  tes, void(*xFree
34360 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74  )(void *)){.  Bt
34370 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
34380 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
34390 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
343a0 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d  if( !pBt->pSchem
343b0 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  a ){.    pBt->pS
343c0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d  chema = sqlite3M
343d0 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73  allocZero(nBytes
343e0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65  );.    pBt->xFre
343f0 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b  eSchema = xFree;
34400 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
34410 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
34420 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65  eturn pBt->pSche
34430 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ma;.}../*.** Ret
34440 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74  urn true if anot
34450 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20  her user of the 
34460 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65  same shared btre
34470 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  e as the argumen
34480 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64  t.** handle hold
34490 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
344a0 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74  ock on the sqlit
344b0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
344c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
344d0 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28  reeSchemaLocked(
344e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
344f0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
34500 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34510 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  d(p->pSqlite->mu
34520 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
34530 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
34540 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61 62    rc = (queryTab
34550 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
34560 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
34570 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  )!=SQLITE_OK);. 
34580 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
34590 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
345a0 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
345b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
345c0 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f  ED_CACHE./*.** O
345d0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
345e0 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  the table whose 
345f0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61  root page is iTa
34600 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20  b.  The.** lock 
34610 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  is a write lock 
34620 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69  if isWritelock i
34630 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64  s true or a read
34640 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69   lock.** if it i
34650 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
34660 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
34670 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
34680 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57  int iTab, u8 isW
34690 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  riteLock){.  int
346a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
346b0 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d  .  u8 lockType =
346c0 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52   (isWriteLock?WR
346d0 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f  ITE_LOCK:READ_LO
346e0 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  CK);.  sqlite3Bt
346f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
34700 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
34710 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  ck(p, iTab, lock
34720 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Type);.  if( rc=
34730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34740 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
34750 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
34760 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
34770 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
34780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34790 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
347a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
347b0 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLOB./*.** Argum
347c0 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65  ent pCsr must be
347d0 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
347e0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20   for writing on 
347f0 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61  an .** INTKEY ta
34800 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ble currently po
34810 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
34820 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a  d table entry. .
34830 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34840 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61   modifies the da
34850 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ta stored as par
34860 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e  t of that entry.
34870 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74  .** Only the dat
34880 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e  a content may on
34890 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ly be modified, 
348a0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
348b0 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  le.** to change 
348c0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
348d0 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a  e data stored..*
348e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
348f0 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73  eePutData(BtCurs
34900 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66  or *pCsr, u32 of
34910 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
34920 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72  oid *z){.  asser
34930 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
34940 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61  tex(pCsr) );.  a
34950 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34960 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e  utex_held(pCsr->
34970 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d  pBtree->pSqlite-
34980 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
34990 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72  ert(pCsr->isIncr
349a0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69  blobHandle);.  i
349b0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3e  f( pCsr->eState>
349c0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
349d0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
349e0 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
349f0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
34a00 20 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e     return pCsr->
34a10 73 6b 69 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  skip;.    }else{
34a20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
34a30 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
34a40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
34a50 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74  k some precondit
34a60 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61  ions: .  **   (a
34a70 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  ) the cursor is 
34a80 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
34a90 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65  ,.  **   (b) the
34aa0 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f  re is no read-lo
34ab0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
34ac0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61  being modified a
34ad0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68  nd.  **   (c) th
34ae0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
34af0 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f  at a valid row o
34b00 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  f an intKey tabl
34b10 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
34b20 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Csr->wrFlag ){. 
34b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34b40 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
34b50 20 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e   assert( !pCsr->
34b60 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20  pBt->readOnly . 
34b70 20 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72           && pCsr
34b80 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
34b90 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
34ba0 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  E );.  if( check
34bb0 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e  ReadLocks(pCsr->
34bc0 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67  pBtree, pCsr->pg
34bd0 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b  noRoot, pCsr) ){
34be0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34bf0 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
34c00 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
34c10 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
34c20 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
34c30 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65  if( pCsr->eState
34c40 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
34c50 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65   || !pCsr->pPage
34c60 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
34c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
34c80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
34c90 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
34ca0 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCsr, offset, a
34cb0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
34cc0 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d  ar *)z, 0, 1);.}
34cd0 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66  ../* .** Set a f
34ce0 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73  lag on this curs
34cf0 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68 65 20  or to cache the 
34d00 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67  locations of pag
34d10 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  es from the .** 
34d20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f  overflow list fo
34d30 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
34d40 77 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  w. This is used 
34d50 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  by cursors opene
34d60 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65  d.** for increme
34d70 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c  ntal blob IO onl
34d80 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  y..**.** This fu
34d90 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c  nction sets a fl
34da0 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74  ag only. The act
34db0 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f  ual page locatio
34dc0 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72  n cache.** (stor
34dd0 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61  ed in BtCursor.a
34de0 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61  Overflow[]) is a
34df0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65  llocated and use
34e00 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  d by function.**
34e10 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
34e20 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e   (the worker fun
34e30 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65  ction for sqlite
34e40 33 42 74 72 65 65 44 61 74 61 28 29 20 61 6e 64  3BtreeData() and
34e50 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
34e60 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76  PutData())..*/.v
34e70 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
34e80 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74  CacheOverflow(Bt
34e90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
34ea0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
34eb0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
34ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
34ed0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34ee0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53  pCur->pBtree->pS
34ef0 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b  qlite->mutex) );
34f00 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d  .  assert(!pCur-
34f10 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
34f20 65 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43  e);.  assert(!pC
34f30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
34f40 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c    pCur->isIncrbl
34f50 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a  obHandle = 1;.}.
34f60 23 65 6e 64 69 66 0a                             #endif.