/ Hex Artifact Content
Login

Artifact f9ea7d1e30d58cb1708aaa0c4c81a2761bd2bd13:


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 31 36 20 32 30 30 37 2f 30  c,v 1.416 2007/0
0190: 38 2f 32 39 20 30 34 3a 30 30 3a 35 38 20 64 72  8/29 04:00:58 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 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1b30: 4d 75 74 65 78 28 70 2d 3e 70 42 74 72 65 65 29  Mutex(p->pBtree)
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 3d 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 23 69 66 6e 64 65 66  ESEEK );.#ifndef
2880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2890: 52 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72  RBLOB.  if( pCur
28a0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
28b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
28c0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
28d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72   }.#endif.  pCur
28e0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
28f0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
2900: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2910: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
2920: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
2930: 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69  y, 0, &pCur->ski
2940: 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
2950: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2960: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
2970: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
2980: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
2990: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29a0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29b0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
29c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29d0: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
29e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
29f0: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
2a00: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2a10: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
2a20: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
2a30: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
2a40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2a50: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2a60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
2a70: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
2a80: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
2a90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2aa0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
2ab0: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
2ac0: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
2ad0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
2ae0: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
2af0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
2b00: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
2b10: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2b20: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
2b30: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
2b40: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2b50: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
2b60: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
2b70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
2b80: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
2b90: 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65  age, iPtrMap, re
2ba0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2bb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2bc0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2bd0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
2be0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
2bf0: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
2c00: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
2c10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
2c20: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
2c30: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
2c40: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
2c50: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
2c60: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2c70: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
2c80: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
2c90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
2ca0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
2cb0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
2cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
2cd0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
2ce0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
2cf0: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
2d00: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
2d10: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
2d20: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
2d30: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
2d40: 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  o'..** An error 
2d50: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2d60: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
2d70: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
2d80: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
2d90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2da0: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
2db0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
2dc0: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
2dd0: 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65  arent){.  DbPage
2de0: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
2df0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
2e00: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
2e10: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
2e20: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
2e30: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
2e40: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
2e50: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
2e60: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
2e70: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
2e80: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
2e90: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
2ea0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2eb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ec0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2ed0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2ee0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
2f00: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
2f10: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
2f20: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
2f30: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
2f40: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
2f50: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
2f60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
2f70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2f80: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
2f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fa0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fb0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
2fc0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
2fd0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
2fe0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2ff0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
3000: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
3010: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3020: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
3030: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66  urn rc;.  }.  of
3040: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
3050: 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79  ROFFSET(pBt, key
3060: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
3070: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
3080: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
3090: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
30a0: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
30b0: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
30c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
30d0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
30e0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
30f0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
3100: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
3110: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
3120: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
3130: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
3140: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
3150: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3160: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
3170: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
3180: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
3190: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
31a0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
31b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
31c0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
31d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31e0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
31f0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
3200: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
3210: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
3220: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
3230: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
3240: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
3250: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
3260: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
3270: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
3280: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
3290: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
32a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
32b0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
32c0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
32d0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
32e0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
32f0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
3300: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
3310: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
3320: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
3330: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
3340: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
3350: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3360: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
3370: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3380: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
3390: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
33a0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
33b0: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
33d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
33e0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
33f0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
3400: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
3410: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3420: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3430: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
3440: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
3450: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
3460: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
3470: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
3480: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
3490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
34a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
34b0: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
34c0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
34d0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
34e0: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
34f0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
3500: 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61  T(pBt, key);.  a
3510: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
3520: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
3530: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
3540: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
3550: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
3560: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3570: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
3580: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
3590: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
35a0: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
35b0: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
35c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
35d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35e0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
35f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3600: 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
3610: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
3620: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
3630: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
3640: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
3650: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
3660: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
3670: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
3680: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
3690: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
36a0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
36b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36c0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
36d0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
36e0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
36f0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
3700: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50  fine findCell(pP
3710: 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20  age, iCell) \.  
3720: 28 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20  ((pPage)->aData 
3730: 2b 20 67 65 74 32 62 79 74 65 28 26 28 70 50 61  + get2byte(&(pPa
3740: 67 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67  ge)->aData[(pPag
3750: 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  e)->cellOffset+2
3760: 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64  *(iCell)])).#ifd
3770: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75  ef SQLITE_TEST.u
3780: 38 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46  8 *sqlite3BtreeF
3790: 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  indCell(MemPage 
37a0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
37b0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
37c0: 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell>=0 );.  asse
37d0: 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79  rt( iCell<get2by
37e0: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37f0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
3800: 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72  t+3]) );.  retur
3810: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
3820: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , iCell);.}.#end
3830: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  if../*.** This a
3840: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
3850: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
3860: 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20  BtreeFindCell() 
3870: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
3880: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
3890: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
38a0: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
38b0: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
38c0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
38d0: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
38e0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
38f0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
3900: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3910: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
3920: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3930: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
3940: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
3950: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
3960: 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65    struct _OvflCe
3970: 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70  ll *pOvfl;.    p
3980: 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61  Ovfl = &pPage->a
3990: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d  Ovfl[i];.    k =
39a0: 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20   pOvfl->idx;.   
39b0: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
39c0: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
39d0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
39e0: 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65  eturn pOvfl->pCe
39f0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
3a00: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
3a10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
3a20: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3a30: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
3a40: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
3a50: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
3a60: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
3a70: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
3a80: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
3a90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
3aa0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69   function.  sqli
3ab0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3ac0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
3ad0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
3ae0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
3af0: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  t and sqlite3Btr
3b00: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
3b10: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
3b20: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
3b30: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
3b40: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
3b50: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
3b60: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
3b70: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
3b80: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
3b90: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73   instead of.** s
3ba0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3bb0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
3bc0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
3bd0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
3be0: 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
3bf0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3c00: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
3c10: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
3c20: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
3c30: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
3c40: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
3c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
3c60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
3c70: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
3c80: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
3c90: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
3ca0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
3cb0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  /.){.  int n;   
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cd0: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
3ce0: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
3cf0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
3d00: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
3d10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3d20: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
3d30: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
3d40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3d50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
3d60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
3d70: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
3d80: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
3d90: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
3da0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
3db0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
3dc0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
3dd0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
3de0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
3df0: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
3e00: 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ata ){.    n += 
3e10: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
3e20: 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64  ll[n], &nPayload
3e30: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3e40: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
3e50: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61  }.  pInfo->nData
3e60: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69   = nPayload;.  i
3e70: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
3e80: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
3e90: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
3ea0: 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d  , (u64 *)&pInfo-
3eb0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
3ec0: 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20  .    u32 x;.    
3ed0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
3ee0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b  (&pCell[n], &x);
3ef0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
3f00: 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f   = x;.    nPaylo
3f10: 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70  ad += x;.  }.  p
3f20: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
3f30: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
3f40: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
3f50: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
3f60: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
3f70: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
3f80: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
3f90: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
3fa0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
3fb0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
3fc0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
3fd0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
3fe0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
3ff0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
4000: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
4010: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
4020: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
4030: 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  s */.    pInfo->
4040: 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61  nLocal = nPayloa
4050: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
4060: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
4070: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
4080: 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e  d + n;.    if( n
4090: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20  Size<4 ){.      
40a0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
40b0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
40c0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
40d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
40e0: 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20  nSize = nSize;. 
40f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
4100: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
4110: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
4120: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
4130: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
4140: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
4150: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
4160: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
4170: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
4180: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
4190: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
41a0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
41b0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
41c0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
41d0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
41e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
41f0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
4200: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
4210: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
4220: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
4230: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
4240: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
4250: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
4260: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
4270: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
4280: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
4290: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
42a0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
42b0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
42c0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
42d0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
42e0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
42f0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4300: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4310: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
4320: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
4330: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4340: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4350: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
4360: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
4370: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
4380: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
4390: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
43a0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
43b0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
43c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
43d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
43e0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
43f0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
4400: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
4410: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
4420: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
4430: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
4440: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
4450: 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73  nLocal = surplus
4460: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4470: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
4480: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
4490: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
44a0: 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d  verflow = pInfo-
44b0: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20  >nLocal + n;.   
44c0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
44d0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
44e0: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
44f0: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
4500: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
4510: 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74  o) \.  sqlite3Bt
4520: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
4530: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
4540: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
4550: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f  l)), (pInfo)).vo
4560: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  id sqlite3BtreeP
4570: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
4580: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
4590: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
45a0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
45b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45d0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
45e0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
45f0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
4600: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
4610: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
4620: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
4630: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4640: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
4650: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
4660: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
4670: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
4680: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
4690: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
46a0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
46b0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
46c0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
46d0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
46e0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
46f0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
4700: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
4710: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
4720: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
4730: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
4740: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64  ointer..*/.#ifnd
4750: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
4760: 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65   int cellSize(Me
4770: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
4780: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c  t iCell){.  Cell
4790: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c  Info info;.  sql
47a0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
47b0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
47c0: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
47d0: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
47e0: 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e  #endif.static in
47f0: 74 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  t cellSizePtr(Me
4800: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4810: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4820: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c  Info info;.  sql
4830: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4840: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
4850: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
4860: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
4870: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4880: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
4890: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
48a0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
48b0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
48c0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
48d0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
48e0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
48f0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
4900: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
4910: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
4920: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
4930: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
4940: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
4950: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
4960: 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20  l){.  if( pCell 
4970: 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
4980: 69 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65  info;.    sqlite
4990: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
49a0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
49b0: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
49c0: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
49d0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
49e0: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
49f0: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
4a00: 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
4a10: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
4a20: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
4a30: 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
4a40: 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
4a50: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
4a60: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
4a70: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
4a80: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
4a90: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
4aa0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
4ab0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
4ac0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4ad0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
4ae0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77  ** If the cell w
4af0: 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20  ith index iCell 
4b00: 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  on page pPage co
4b10: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4b20: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4b30: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4b40: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4b50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4b60: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4b70: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4b80: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4b90: 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  vfl(MemPage *pPa
4ba0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
4bb0: 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61    u8 *pCell;.  a
4bc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4bd0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
4be0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
4bf0: 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76    pCell = findOv
4c00: 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65  erflowCell(pPage
4c10: 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  , iCell);.  retu
4c20: 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  rn ptrmapPutOvfl
4c30: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
4c40: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
4c50: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
4c60: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
4c70: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
4c80: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
4c90: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
4ca0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
4cb0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
4cc0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
4cd0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
4ce0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
4cf0: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
4d00: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
4d10: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
4d20: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a  ontent area..*/.
4d30: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
4d40: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
4d50: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
4d60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
4d80: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
4d90: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
4db0: 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c  ss of a i-th cel
4dc0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  l */.  int addr;
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
4df0: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
4e00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
4e10: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ay */.  int hdr;
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
4e40: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
4e50: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
4e80: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
4e90: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
4ea0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
4eb0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
4ec0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
4ed0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
4ee0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
4ef0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
4f00: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
4f10: 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
4f30: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
4f40: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
4f50: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f70: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
4f80: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
4f90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4fa0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
4fb0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
4fc0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4fd0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
4fe0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
4ff0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ll content */.. 
5000: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5010: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5020: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5040: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5050: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5060: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
5070: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
5080: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
5090: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
50a0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
50b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
50c0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
50d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
50e0: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f   temp = sqlite3_
50f0: 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70  malloc( pPage->p
5100: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
5110: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20    if( temp==0 ) 
5120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5130: 4d 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  MEM;.  data = pP
5140: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
5150: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
5160: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
5170: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
5180: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
5190: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
51a0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
51b0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
51c0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
51d0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
51e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
51f0: 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
5200: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5210: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
5220: 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
5230: 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
5240: 62 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73  brk);.  brk = us
5250: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28  ableSize;.  for(
5260: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
5270: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
5280: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
5290: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
52a0: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
52b0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
52c0: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
52d0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
52e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  ;.    assert( pc
52f0: 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
5300: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  bleSize );.    s
5310: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
5320: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
5330: 63 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20  c]);.    brk -= 
5340: 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  size;.    memcpy
5350: 28 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65  (&data[brk], &te
5360: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
5370: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
5380: 72 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61  r, brk);.  }.  a
5390: 73 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c  ssert( brk>=cell
53a0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29  Offset+2*nCell )
53b0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
53c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b  ta[hdr+5], brk);
53d0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
53e0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
53f0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
5400: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72  r+7] = 0;.  addr
5410: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a   = cellOffset+2*
5420: 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28  nCell;.  memset(
5430: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20  &data[addr], 0, 
5440: 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c  brk-addr);.  sql
5450: 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70 29 3b  ite3_free(temp);
5460: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
5480: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
5490: 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61  es of space on a
54a0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   page..**.** Ret
54b0: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
54c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
54d0: 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  ] of the first b
54e0: 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  yte of.** the ne
54f0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72  w allocation. Or
5500: 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
5510: 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
5520: 20 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f   free.** space o
5530: 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61  n the page to sa
5540: 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61  tisfy the alloca
5550: 74 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a  tion request..**
5560: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
5570: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
5580: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
5590: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
55a0: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
55b0: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
55c0: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
55d0: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
55e0: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
55f0: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
5600: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
5610: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
5620: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
5630: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
5640: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
5650: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
5660: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5670: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
5680: 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72  nt addr, pc, hdr
5690: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
56a0: 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74  int nFrag;.  int
56b0: 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   top;.  int nCel
56c0: 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  l;.  int cellOff
56d0: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
56e0: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20  char *data;.  . 
56f0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5700: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
5710: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5720: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5730: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5740: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
5750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5760: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5770: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5780: 78 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  x) );.  if( nByt
5790: 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b  e<4 ) nByte = 4;
57a0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46  .  if( pPage->nF
57b0: 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61  ree<nByte || pPa
57c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
57d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50  ) return 0;.  pP
57e0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
57f0: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
5800: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
5810: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
5820: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
5830: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
5840: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
5850: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
5860: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
5870: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5880: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5890: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
58a0: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
58b0: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
58c0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
58d0: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
58e0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
58f0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5900: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5910: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
5920: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
5930: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5940: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
5950: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
5960: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
5970: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5980: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5990: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
59a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
59b0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
59c0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
59d0: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
59e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
59f0: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5a00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5a10: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
5a20: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
5a30: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
5a40: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
5a50: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
5a60: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5a70: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5a80: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5a90: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5aa0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5ab0: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5ac0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5ad0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5ae0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5af0: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5b00: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5b10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5b20: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
5b30: 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  te ){.    if( de
5b40: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
5b50: 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ge) ) return 0;.
5b60: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
5b70: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5b80: 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e  ;.  }.  top -= n
5b90: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
5ba0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5bb0: 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  Cell <= top );. 
5bc0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5bd0: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
5be0: 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f  return top;.}../
5bf0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
5c00: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
5c10: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
5c20: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
5c30: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
5c40: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
5c50: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69  ck is pPage->aDi
5c60: 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  sk[start].** and
5c70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5c80: 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22   block is "size"
5c90: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f   bytes..**.** Mo
5ca0: 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74  st of the effort
5cb0: 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65   here is involve
5cc0: 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61  d in coalesing a
5cd0: 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20  djacent.** free 
5ce0: 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69  blocks into a si
5cf0: 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c  ngle big free bl
5d00: 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ock..*/.static v
5d10: 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65  oid freeSpace(Me
5d20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
5d30: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
5d40: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
5d50: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75  pbegin, hdr;.  u
5d60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
5d70: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
5d80: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
5d90: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5da0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5db0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5dc0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5dd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
5de0: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
5df0: 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
5e00: 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61  leaf?0:4) );.  a
5e10: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
5e20: 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42  size)<=pPage->pB
5e30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
5e40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5e50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5e60: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5e70: 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34   );.  if( size<4
5e80: 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69   ) size = 4;..#i
5e90: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
5ea0: 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f  RE_DELETE.  /* O
5eb0: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
5ec0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
5ed0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
5ee0: 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a   SECURE_DELETE .
5ef0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
5f00: 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
5f10: 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73  e-time */.  mems
5f20: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
5f30: 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69   0, size);.#endi
5f40: 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
5f50: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
5f60: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
5f70: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f  of freeblocks */
5f80: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5f90: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
5fa0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
5fb0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
5fc0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
5fd0: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
5fe0: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
5ff0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
6000: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6010: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
6020: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
6030: 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20  ddr );.    addr 
6040: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
6050: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
6060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6070: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73  leSize-4 );.  as
6080: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
6090: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
60a0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
60b0: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
60c0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
60d0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
60e0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
60f0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
6100: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
6110: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20  Free += size;.. 
6120: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
6130: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
6140: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
6150: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
6160: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
6170: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
6180: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
6190: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
61a0: 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73  , psize;.    ass
61b0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
61c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
61d0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
61e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
61f0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
6200: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6210: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
6220: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
6230: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
6240: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
6250: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
6260: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
6270: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
6280: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
6290: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
62a0: 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64   assert( frag<=d
62b0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
62c0: 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20  fset+7] );.     
62d0: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
62e0: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61  Offset+7] -= fra
62f0: 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  g;.      put2byt
6300: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
6310: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6320: 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20  pnext]));.      
6330: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6340: 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b  begin+2], pnext+
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 2b 32 5d 29 2d 70 62 65 67 69 6e 29  next+2])-pbegin)
6370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6380: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
6390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
63a0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
63b0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
63c0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
63d0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
63e0: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
63f0: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
6400: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
6410: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
6420: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
6430: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
6440: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
6450: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
6460: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
6470: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
6480: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
6490: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
64a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
64b0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b  ta[hdr+5], top +
64c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
64d0: 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d  pbegin+2]));.  }
64e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
64f0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
6500: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
6510: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
6520: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
6530: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
6540: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
6550: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
6560: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rdingly..*/.stat
6570: 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c  ic void decodeFl
6580: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
6590: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
65a0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
65b0: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
65c0: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
65d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
65e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
65f0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
6600: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
6610: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6620: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6630: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6640: 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  .  pPage->intKey
6650: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28   = (flagByte & (
6660: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
6670: 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20  EAFDATA))!=0;.  
6680: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6690: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
66a0: 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a  F_ZERODATA)!=0;.
66b0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
66c0: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
66d0: 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67  LEAF)!=0;.  pPag
66e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
66f0: 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66  = 4*(pPage->leaf
6700: 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  ==0);.  pBt = pP
6710: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
6720: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
6730: 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70  EAFDATA ){.    p
6740: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
6750: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   1;.    pPage->m
6760: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
6770: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
6780: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
6790: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  lse{.    pPage->
67b0: 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20  leafData = 0;.  
67c0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
67d0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
67e0: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
67f0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
6800: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  nLocal;.  }.  pP
6810: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21  age->hasData = !
6820: 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61  (pPage->zeroData
6830: 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61   || (!pPage->lea
6840: 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  f && pPage->leaf
6850: 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Data));.}../*.**
6860: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
6870: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
6880: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
6890: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   block..**.** Th
68a0: 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
68b0: 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ter must be a po
68c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
68d0: 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  Page which.** is
68e0: 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
68f0: 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e  he page being in
6900: 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
6910: 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72  root of a.** BTr
6920: 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74  ee has no parent
6930: 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74   and so for that
6940: 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d   page, pParent==
6950: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  NULL..**.** Retu
6960: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
6970: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
6980: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
6990: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
69a0: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
69b0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
69c0: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
69d0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
69e0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
69f0: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
6a00: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
6a10: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
6a20: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
6a30: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
6a40: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
6a50: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
6a60: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
6a70: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
6a80: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a  3BtreeInitPage(.
6a90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
6aa0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6ab0: 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69  page to be initi
6ac0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  alized */.  MemP
6ad0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
6ae0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
6af0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6b00: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b   */.){.  int pc;
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6b20: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
6b30: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
6b40: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
6b50: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
6b60: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
6b70: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
6b80: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
6b90: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
6ba0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
6bb0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
6bc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
6bd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
6be0: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
6bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
6c00: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
6c10: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
6c20: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
6c30: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
6c40: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
6c50: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
6c60: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
6c70: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
6c80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
6c90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6ca0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
6cb0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
6cc0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
6cd0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
6ce0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
6cf0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70  ent area */..  p
6d00: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
6d10: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d  .  assert( pBt!=
6d20: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6d30: 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61  Parent==0 || pPa
6d40: 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  rent->pBt==pBt )
6d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6d60: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6d70: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6d80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
6d90: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
6da0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
6db0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
6dc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6dd0: 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69  aData == &((unsi
6de0: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
6df0: 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
6e00: 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ] );.  if( pPage
6e10: 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65  ->pParent!=pPare
6e20: 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50  nt && (pPage->pP
6e30: 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67  arent!=0 || pPag
6e40: 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20  e->isInit) ){.  
6e50: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
6e60: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
6e70: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
6e80: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
6e90: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
6ea0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6eb0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
6ec0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
6ed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6ee0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
6ef0: 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50  pParent==0 && pP
6f00: 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20  arent!=0 ){.    
6f10: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
6f20: 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71   pParent;.    sq
6f30: 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
6f40: 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
6f50: 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61  .  }.  hdr = pPa
6f60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
6f70: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
6f80: 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c  Data;.  decodeFl
6f90: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
6fa0: 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e  hdr]);.  pPage->
6fb0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
6fc0: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
6fd0: 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69   = 0;.  usableSi
6fe0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
6ff0: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63  Size;.  pPage->c
7000: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
7010: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
7020: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
7030: 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  f;.  top = get2b
7040: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7050: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
7060: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
7070: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
7080: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
7090: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
70a0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
70b0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
70c0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
70d0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
70e0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
70f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7100: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
7110: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  age->nCell==0 &&
7120: 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70   pParent!=0 && p
7130: 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
7140: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61  ){.    /* All pa
7150: 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74  ges must have at
7160: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c   least one cell,
7170: 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74   except for root
7180: 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65   pages */.    re
7190: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
71a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
71b0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
71c0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
71d0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
71e0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
71f0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
7200: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
7210: 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65  r+7] + top - (ce
7220: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
7230: 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68  ge->nCell);.  wh
7240: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
7250: 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b   int next, size;
7260: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
7270: 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20  leSize-4 ){.    
7280: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
7290: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
72a0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
72b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
72c0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
72d0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
72e0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
72f0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
7300: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
7310: 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20    if( next>0 && 
7320: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
7330: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
7340: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
7350: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
7360: 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
7370: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7380: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
7390: 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65     nFree += size
73a0: 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b  ;.    pc = next;
73b0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
73c0: 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69  ree = nFree;.  i
73d0: 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65  f( nFree>=usable
73e0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46  Size ){.    /* F
73f0: 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74  ree space cannot
7400: 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61   exceed total pa
7410: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72  ge size */.    r
7420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7430: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a  RUPT_BKPT; .  }.
7440: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
7450: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
7460: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7470: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
7480: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
7490: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
74a0: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
74b0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
74c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
74d0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
74e0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
74f0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
7500: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7510: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
7520: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
7530: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
7540: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7550: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69  Offset;.  int fi
7560: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
7570: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
7580: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
7590: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
75a0: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
75b0: 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65   &data[pBt->page
75c0: 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e  Size] == (unsign
75d0: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29  ed char*)pPage )
75e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
75f0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7600: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7610: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7630: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7640: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
7650: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
7660: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
7670: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  );.  data[hdr] =
7680: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
7690: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
76a0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
76b0: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
76c0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
76d0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
76e0: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
76f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
7700: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
7710: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
7720: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7730: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
7740: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7750: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
7760: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
7770: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
7780: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
7790: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
77a0: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
77b0: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
77c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
77d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
77e0: 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
77f0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
7800: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
7810: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
7820: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
7830: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
7840: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
7850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
7860: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
7870: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
7880: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
7890: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
78a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
78b0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
78c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
78d0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
78e0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
78f0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
7900: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
7910: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
7920: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
7930: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
7940: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
7950: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
7960: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
7970: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
7980: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
7990: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
79a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
79b0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
79c0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
79d0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
79e0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
79f0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
7a00: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
7a10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
7a20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7a30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
7a40: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
7a50: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7a60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
7a70: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
7a80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
7a90: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
7aa0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
7ab0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
7ac0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
7ad0: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
7ae0: 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  ge;.  DbPage *pD
7af0: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
7b00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b10: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b20: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
7b30: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
7b40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
7b50: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
7b60: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
7b70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7b80: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20  urn rc;.  pPage 
7b90: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
7ba0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7bb0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
7bc0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
7bd0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7be0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
7bf0: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
7c00: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
7c10: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
7c20: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
7c30: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
7c40: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
7c50: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
7c60: 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
7c70: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
7c80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7c90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
7ca0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
7cb0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
7cc0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
7cd0: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
7ce0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
7cf0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
7d00: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
7d10: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
7d20: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
7d30: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
7d40: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
7d50: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
7d60: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
7d70: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
7d80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
7d90: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
7da0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
7db0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
7dc0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
7dd0: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
7de0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
7df0: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
7e00: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
7e10: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
7e20: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
7e30: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
7e40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7e50: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7e60: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
7e70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7e80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7e90: 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20  PT; .  }.  rc = 
7ea0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
7eb0: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
7ec0: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
7ed0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7ee0: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
7ef0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
7f00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
7f10: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c  nitPage(*ppPage,
7f20: 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20   pParent);.  }. 
7f30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7f40: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
7f50: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
7f60: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
7f70: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
7f80: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  or.** call to sq
7f90: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
7fa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7fb0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
7fc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
7fd0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
7fe0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7ff0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
8000: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8010: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8020: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
8030: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
8040: 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63  ze]==(unsigned c
8050: 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  har*)pPage );.  
8060: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8070: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8080: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
80a0: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
80b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
80c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
80d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
80e0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
80f0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
8100: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
8110: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
8120: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
8130: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
8140: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
8150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8160: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
8170: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8180: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8190: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
81a0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
81b0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
81c0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
81d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
81e0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
81f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
8200: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  sInit==0 || sqli
8210: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8220: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8230: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
8240: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
8250: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
8260: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
8270: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
8280: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 31  pPage->isInit==1
8290: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
82a0: 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50  pParent->pBt==pP
82b0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
82c0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
82d0: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
82e0: 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
82f0: 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
8300: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
8310: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
8320: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
8330: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
8340: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
8350: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
8360: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
8370: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
8380: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
8390: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
83a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
83b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
83c0: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
83d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
83e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
83f0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
8400: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
8410: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
8420: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
8430: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
8440: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
8450: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
8460: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
8470: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8480: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8490: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
84a0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
84b0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
84c0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
84d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
84e0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
84f0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
8500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
8510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8520: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8530: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
8540: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
8550: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
8560: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
8570: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
8580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
8590: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
85a0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
85b0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
85c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
85d0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
85e0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
85f0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
8600: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
8610: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
8620: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
8630: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
8640: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
8650: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
8660: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
8670: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
8680: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
8690: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
86a0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
86b0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
86c0: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
86d0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
86e0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
86f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8700: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
8710: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
8720: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
8730: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8740: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
8750: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
8760: 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20  ite3 *pSqlite,  
8770: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
8780: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
8790: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
87a0: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
87b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
87c0: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
87d0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
87e0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
8800: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ons */.){.  sqli
8810: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
8820: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
8830: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
8840: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
8850: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
8860: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
8870: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
8880: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
8890: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
88a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
88b0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
88c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
88d0: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  int nReserve;.  
88e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
88f0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20  bHeader[100];.. 
8900: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
8910: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
8920: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
8930: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
8940: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
8950: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
8960: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
8970: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
8980: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
8990: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
89a0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
89b0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
89c0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
89d0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
89e0: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
89f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8a00: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8a10: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8a20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8a30: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
8a40: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
8a50: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
8a60: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
8a70: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
8a80: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
8a90: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
8aa0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
8ab0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
8ac0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
8ad0: 73 65 72 74 28 20 70 53 71 6c 69 74 65 21 3d 30  sert( pSqlite!=0
8ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8af0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8b00: 28 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  (pSqlite->mutex)
8b10: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 70 53   );..  pVfs = pS
8b20: 71 6c 69 74 65 2d 3e 70 56 66 73 3b 0a 20 20 70  qlite->pVfs;.  p
8b30: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
8b40: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
8b50: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
8b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8b70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
8b80: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
8b90: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53  NS_NONE;.  p->pS
8ba0: 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74 65 3b  qlite = pSqlite;
8bb0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
8bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
8bd0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
8be0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8bf0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
8c00: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
8c10: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
8c20: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
8c30: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
8c40: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
8c50: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
8c60: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
8c70: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
8c80: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
8c90: 50 52 49 56 41 54 45 29 3d 3d 30 0a 20 20 20 26  PRIVATE)==0.   &
8ca0: 26 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20  & isMemdb==0.   
8cb0: 26 26 20 28 70 53 71 6c 69 74 65 2d 3e 66 6c 61  && (pSqlite->fla
8cc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
8cd0: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
8ce0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
8cf0: 65 5b 30 5d 0a 20 20 20 26 26 20 73 71 6c 69 74  e[0].   && sqlit
8d00: 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61  e3SharedCacheEna
8d10: 62 6c 65 64 0a 20 20 29 7b 0a 20 20 20 20 63 68  bled.  ){.    ch
8d20: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
8d30: 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
8d40: 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d  te3_malloc(pVfs-
8d50: 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  >mxPathname);.  
8d60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
8d70: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
8d80: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
8d90: 31 3b 0a 20 20 20 20 69 66 28 20 70 53 71 6c 69  1;.    if( pSqli
8da0: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 53 71 6c  te ){.      pSql
8db0: 69 74 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51  ite->flags |= SQ
8dc0: 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65  LITE_SharedCache
8dd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8de0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
8df0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8e00: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72  free(p);.      r
8e10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8e20: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  EM;.    }.    sq
8e30: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
8e40: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
8e50: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
8e60: 6d 65 29 3b 0a 20 20 20 20 6d 75 74 65 78 53 68  me);.    mutexSh
8e70: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ared = sqlite3_m
8e80: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
8e90: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
8ea0: 41 53 54 45 52 29 3b 0a 20 20 20 20 73 71 6c 69  ASTER);.    sqli
8eb0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8ec0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
8ed0: 20 20 66 6f 72 28 70 42 74 3d 73 71 6c 69 74 65    for(pBt=sqlite
8ee0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
8ef0: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
8f00: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
8f10: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
8f20: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  0 );.      if( 0
8f30: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
8f40: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
8f50: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
8f60: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
8f70: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
8f80: 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
8f90: 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
8fa0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 42  ){.        p->pB
8fb0: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
8fc0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
8fd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8fe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8ff0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9000: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
9010: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9020: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
9030: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
9040: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
9050: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
9060: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
9070: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9080: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
9090: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
90a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
90b0: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
90c0: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
90d0: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
90e0: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
90f0: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
9100: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
9110: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
9120: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
9130: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
9140: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
9150: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
9160: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
9170: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
9180: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
9190: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
91a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
91b0: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
91c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
91d0: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
91e0: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
91f0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
9200: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
9210: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
9220: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9230: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9240: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
9250: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9260: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9270: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
9280: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
9290: 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c  ame, EXTRA_SIZE,
92a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
92b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
92c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
92d0: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
92e0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
92f0: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
9300: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
9310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9320: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9330: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
9340: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
9350: 7d 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  }.    p->pBt = p
9360: 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74  Bt;.  .    sqlit
9370: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
9380: 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ctor(pBt->pPager
9390: 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  , pageDestructor
93a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
93b0: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70  gerSetReiniter(p
93c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
93d0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74  Reinit);.    pBt
93e0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
93f0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
9400: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
9410: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
9420: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
9430: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
9440: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
9450: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
9460: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
9470: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
9480: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
9490: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
94a0: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
94b0: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
94c0: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
94d0: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
94e0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
94f0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ze = sqlite3Page
9500: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
9510: 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
9520: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
9530: 64 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a  dFrac = 64;   /*
9540: 20 32 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42   25% */.      pB
9550: 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20  t->minEmbedFrac 
9560: 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25  = 32;   /* 12.5%
9570: 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d   */.      pBt->m
9580: 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b  inLeafFrac = 32;
9590: 20 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a      /* 12.5% */.
95a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
95b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
95c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
95d0: 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
95e0: 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
95f0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
9600: 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
9610: 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
9620: 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
9630: 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
9640: 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
9650: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
9660: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9670: 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
9680: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
9690: 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
96a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
96b0: 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
96c0: 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
96d0: 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
96e0: 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
96f0: 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
9700: 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
9710: 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
9720: 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
9730: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
9740: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
9750: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
9760: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
9770: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
9780: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
9790: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
97a0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
97b0: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
97c0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
97d0: 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
97e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
97f0: 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
9800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9810: 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
9820: 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
9830: 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
9840: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31  c = zDbHeader[21
9850: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  ];.      pBt->mi
9860: 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62  nEmbedFrac = zDb
9870: 48 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20  Header[22];.    
9880: 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72    pBt->minLeafFr
9890: 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ac = zDbHeader[2
98a0: 33 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  3];.      pBt->p
98b0: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
98c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
98d0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
98e0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
98f0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
9900: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
9910: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
9920: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
9930: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
9940: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
9950: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
9960: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  dif.    }.    pB
9970: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
9980: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
9990: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
99a0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
99b0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
99c0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
99d0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
99e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
99f0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9a00: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
9a10: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9a20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9a30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9a40: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9a50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9a60: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
9a70: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
9a80: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
9a90: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
9aa0: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
9ab0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9ac0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
9ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9ae0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
9af0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
9b00: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
9b10: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
9b20: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
9b30: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
9b40: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
9b50: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
9b60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
9b70: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9b80: 46 41 53 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  FAST);.      sql
9b90: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9ba0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9bb0: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
9bc0: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
9bd0: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
9be0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
9bf0: 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20  heList = pBt;.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
9c10: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
9c20: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
9c30: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
9c40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9c50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9c60: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9c70: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
9c80: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
9c90: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
9ca0: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
9cb0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
9cc0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
9cd0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
9ce0: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
9cf0: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
9d00: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
9d10: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
9d20: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
9d30: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
9d40: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
9d50: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
9d60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
9d70: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
9d80: 72 28 69 3d 30 3b 20 69 3c 70 53 71 6c 69 74 65  r(i=0; i<pSqlite
9d90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
9da0: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 70     if( (pSib = p
9db0: 53 71 6c 69 74 65 2d 3e 61 44 62 5b 69 5d 2e 70  Sqlite->aDb[i].p
9dc0: 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
9dd0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
9de0: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
9df0: 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
9e00: 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
9e10: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
9e20: 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
9e30: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
9e40: 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
9e50: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
9e60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
9e70: 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
9e80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9e90: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
9ea0: 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
9eb0: 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
9ec0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
9ed0: 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
9ee0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9ef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
9f00: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
9f10: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
9f20: 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
9f30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
9f40: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
9f50: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
9f60: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
9f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9f80: 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
9f90: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
9fa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
9fc0: 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
9fd0: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
9fe0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
9ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a000: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
a010: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
a020: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
a030: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
a040: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a050: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
a060: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a070: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
a080: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a090: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
a0a0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
a0b0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
a0c0: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
a0d0: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
a0e0: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
a0f0: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
a100: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
a110: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
a120: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
a130: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
a140: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
a150: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
a160: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
a170: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
a180: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
a190: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
a1a0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
a1b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a1c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
a1d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
a1e0: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
a1f0: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
a200: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
a210: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a220: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
a230: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a240: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
a250: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
a260: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
a270: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71  IC_MASTER);.  sq
a280: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a290: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
a2a0: 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
a2b0: 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
a2c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a2d0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3d  SharedCacheList=
a2e0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  =pBt ){.      sq
a2f0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a300: 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  List = pBt->pNex
a310: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
a320: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
a330: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a340: 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  st;.      while(
a350: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
a360: 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
a370: 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
a380: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
a390: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69   }.      if( pLi
a3a0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  st ){.        pL
a3b0: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
a3c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a3e0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
a3f0: 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  t->mutex);.    r
a400: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
a410: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a420: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
a430: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
a440: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
a450: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
a460: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
a470: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
a480: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
a490: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
a4a0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
a4b0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
a4c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
a4d0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
a4e0: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
a4f0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
a500: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
a510: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
a520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a530: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69  ex_held(p->pSqli
a540: 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
a550: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
a560: 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
a570: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
a580: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
a590: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
a5a0: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
a5b0: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
a5c0: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
a5d0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
a5e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
a5f0: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
a600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a610: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
a620: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
a630: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
a640: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
a650: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
a660: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a670: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
a680: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
a690: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
a6a0: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
a6b0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a6c0: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
a6d0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
a6e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
a6f0: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
a700: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
a710: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
a720: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
a730: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
a740: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
a750: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
a760: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
a770: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
a780: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
a790: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
a7a0: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
a7b0: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
a7c0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
a7d0: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
a7e0: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
a7f0: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
a800: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
a810: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
a820: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
a830: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
a840: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
a850: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
a860: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
a870: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
a880: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
a890: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
a8a0: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
a8b0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
a8c0: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
a8d0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
a8e0: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
a8f0: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
a900: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
a910: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
a920: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
a930: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a940: 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
a950: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
a960: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
a970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a980: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
a990: 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
a9a0: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
a9b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
a9c0: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
a9d0: 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
a9e0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
a9f0: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
aa00: 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
aa10: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
aa20: 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
aa30: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
aa40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
aa50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
aa60: 67 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ge the busy hand
aa70: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ler callback fun
aa80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
aa90: 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75 73  lite3BtreeSetBus
aaa0: 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a  yHandler(Btree *
aab0: 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  p, BusyHandler *
aac0: 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53  pHandler){.  BtS
aad0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
aae0: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
aaf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ab00: 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  d(p->pSqlite->mu
ab10: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
ab20: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
ab30: 20 20 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64    pBt->pBusyHand
ab40: 6c 65 72 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a  ler = pHandler;.
ab50: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
ab60: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
ab70: 2d 3e 70 50 61 67 65 72 2c 20 70 48 61 6e 64 6c  ->pPager, pHandl
ab80: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
ab90: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
aba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
abb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
abc0: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
abd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
abe0: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
abf0: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
ac00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
ac10: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
ac20: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
ac30: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
ac40: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
ac50: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
ac60: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
ac70: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
ac80: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
ac90: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
aca0: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
acb0: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
acc0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
acd0: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
ace0: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
acf0: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
ad00: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
ad10: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
ad20: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
ad30: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
ad40: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
ad50: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
ad60: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
ad70: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
ad80: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
ad90: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
ada0: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
adb0: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
adc0: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
add0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
ade0: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
adf0: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
ae00: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
ae10: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
ae20: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
ae30: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
ae40: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
ae50: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
ae60: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
ae70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
ae80: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
ae90: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
aea0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
aeb0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
aec0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
aed0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c  tex_held(p->pSql
aee0: 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
aef0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
af00: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
af10: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
af20: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
af30: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
af40: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
af50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
af60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
af70: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
af80: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
af90: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
afa0: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
afb0: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
afc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
afd0: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
afe0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
aff0: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
b000: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
b010: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
b020: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
b030: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
b040: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
b050: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
b060: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
b070: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
b080: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
b090: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
b0a0: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
b0b0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
b0c0: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
b0d0: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
b0e0: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
b0f0: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
b100: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
b110: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
b120: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b130: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
b140: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
b150: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
b160: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
b170: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
b180: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
b190: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
b1a0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
b1b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b1c0: 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74  (p->pSqlite->mut
b1d0: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
b1e0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
b1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
b200: 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
b210: 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
b220: 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
b230: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
b240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b250: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
b260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
b270: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
b280: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
b290: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
b2a0: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
b2b0: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
b2c0: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
b2d0: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
b2e0: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
b2f0: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
b300: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
b310: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b320: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
b330: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
b340: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b350: 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  ld(p->pSqlite->m
b360: 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c  utex) );  .  sql
b370: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
b390: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
b3a0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
b3b0: 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74  3PagerNosync(pBt
b3c0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
b3d0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
b3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
b3f0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
b400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
b410: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
b420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b430: 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
b440: 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
b450: 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
b460: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
b470: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
b480: 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  per page..**.** 
b490: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
b4a0: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
b4b0: 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
b4c0: 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
b4d0: 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
b4e0: 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
b4f0: 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
b500: 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
b510: 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
b520: 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
b530: 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
b540: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
b550: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
b560: 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
b570: 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
b580: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
b590: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
b5a0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
b5b0: 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
b5c0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
b5d0: 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
b5e0: 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
b5f0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
b600: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
b610: 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
b620: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
b630: 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
b640: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
b650: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b660: 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
b670: 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
b680: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
b690: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b6a0: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
b6b0: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
b6c0: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
b6d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b6e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
b6f0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b700: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
b710: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
b720: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
b730: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
b740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
b750: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
b760: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
b770: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
b780: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
b790: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
b7a0: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
b7b0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
b7c0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
b7d0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
b7e0: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
b7f0: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
b800: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
b810: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
b820: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
b830: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
b840: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
b850: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
b860: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
b870: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
b880: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a  >pPager, pageSiz
b890: 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  e);.  }.  pBt->u
b8a0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
b8b0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
b8c0: 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  erve;.  sqlite3B
b8d0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
b8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b8f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b900: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
b910: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
b920: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
b930: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
b940: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
b950: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
b960: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
b970: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
b980: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
b990: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
b9a0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b9b0: 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
b9c0: 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
b9d0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
b9e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
b9f0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
ba00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ba10: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
ba20: 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
ba30: 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
ba40: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
ba50: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
ba60: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
ba70: 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
ba80: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
ba90: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
baa0: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
bab0: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
bac0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
bad0: 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
bae0: 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
baf0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
bb00: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
bb10: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
bb20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
bb30: 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
bb40: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
bb50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
bb60: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
bb70: 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
bb80: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
bb90: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
bba0: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
bbb0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
bbc0: 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
bbd0: 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
bbe0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
bbf0: 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
bc00: 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
bc10: 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
bc20: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
bc30: 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
bc40: 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
bc50: 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
bc60: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
bc70: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
bc80: 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
bc90: 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
bca0: 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
bcb0: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
bcc0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
bcd0: 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
bce0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
bcf0: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
bd00: 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
bd10: 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
bd20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
bd30: 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
bd40: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
bd50: 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
bd60: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
bd70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bd80: 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61  K;.  int av = (a
bd90: 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a  utoVacuum?1:0);.
bda0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bdb0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
bdc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
bdd0: 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75  d && av!=pBt->au
bde0: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
bdf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
be00: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
be10: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
be20: 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73  um = av;.  }.  s
be30: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
be40: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
be50: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
be60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
be70: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
be80: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
be90: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
bea0: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
beb0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
bec0: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
bed0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
bee0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
bef0: 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
bf00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
bf10: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
bf20: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
bf30: 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
bf40: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
bf50: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
bf60: 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
bf70: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
bf80: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
bf90: 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
bfa0: 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
bfb0: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
bfc0: 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
bfd0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
bfe0: 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
bff0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c000: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
c010: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
c020: 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
c030: 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
c040: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
c050: 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
c060: 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
c070: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
c080: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c090: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
c0a0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
c0b0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
c0c0: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
c0d0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
c0e0: 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
c0f0: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
c100: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
c110: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
c120: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
c130: 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
c140: 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
c150: 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
c160: 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
c170: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
c180: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
c190: 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61  t){.  int rc, pa
c1a0: 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67  geSize;.  MemPag
c1b0: 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
c1c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c1d0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c1e0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
c1f0: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
c200: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c210: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
c220: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
c230: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
c240: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c250: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
c260: 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20   ..  /* Do some 
c270: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
c280: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
c290: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
c2a0: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
c2b0: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
c2c0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51   .  */.  rc = SQ
c2d0: 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69  LITE_NOTADB;.  i
c2e0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
c2f0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
c300: 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75  ager)>0 ){.    u
c310: 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
c320: 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  1->aData;.    if
c330: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
c340: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
c350: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
c360: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
c370: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
c380: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
c390: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
c3a0: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
c3b0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
c3c0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
c3d0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
c3e0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
c3f0: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
c400: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
c410: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
c420: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
c430: 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
c440: 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  <512 ){.      go
c450: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
c460: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
c470: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
c480: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
c490: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
c4a0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
c4b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c4c0: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
c4d0: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
c4e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35  Bt->usableSize<5
c4f0: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
c500: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c510: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
c520: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
c530: 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20  = page1[21];.   
c540: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
c550: 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a  ac = page1[22];.
c560: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
c570: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d  Frac = page1[23]
c580: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c590: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c5a0: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
c5b0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
c5c0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
c5d0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
c5e0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
c5f0: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
c600: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
c610: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
c620: 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
c630: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
c640: 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
c650: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
c660: 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
c670: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
c680: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
c690: 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
c6a0: 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
c6b0: 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
c6c0: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
c6d0: 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
c6e0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
c6f0: 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
c700: 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
c710: 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
c720: 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
c730: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
c740: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
c750: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
c760: 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
c770: 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
c780: 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
c790: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
c7a0: 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
c7b0: 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
c7c0: 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
c7d0: 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
c7e0: 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
c7f0: 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
c800: 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
c810: 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
c820: 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
c830: 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
c840: 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
c850: 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
c860: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
c870: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
c880: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
c890: 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72  *pBt->maxEmbedFr
c8a0: 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
c8b0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
c8c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
c8d0: 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  12)*pBt->minEmbe
c8e0: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
c8f0: 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
c900: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c910: 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
c920: 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
c930: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74  ableSize-12)*pBt
c940: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35  ->minLeafFrac/25
c950: 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42  5 - 23;.  if( pB
c960: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d  t->minLocal>pBt-
c970: 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74  >maxLocal || pBt
c980: 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a  ->maxLocal<0 ){.
c990: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c9a0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  nit_failed;.  }.
c9b0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
c9c0: 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
c9d0: 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
c9e0: 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
c9f0: 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
ca00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ca10: 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
ca20: 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
ca30: 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
ca40: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
ca50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ca60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ca70: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b   works like lock
ca80: 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74  Btree() except t
ca90: 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f  hat it also invo
caa0: 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20  kes the.** busy 
cab0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72  callback if ther
cac0: 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e is lock conten
cad0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
cae0: 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  int lockBtreeWit
caf0: 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52  hRetry(Btree *pR
cb00: 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ef){.  int rc = 
cb10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
cb20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
cb30: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65  eeHoldsMutex(pRe
cb40: 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66  f) );.  if( pRef
cb50: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
cb60: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
cb70: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
cb80: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
cb90: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
cba0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
cbb0: 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
cbc0: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
cbd0: 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
cbe0: 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
cbf0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
cc00: 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
cc10: 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
cc20: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
cc30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cc40: 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
cc50: 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
cc60: 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
cc70: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
cc80: 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
cc90: 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
cca0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
ccb0: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
ccc0: 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
ccd0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
cce0: 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
ccf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
cd00: 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
cd10: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
cd20: 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
cd30: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
cd40: 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
cd50: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
cd60: 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
cd70: 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
cd80: 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
cd90: 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
cda0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
cdb0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
cdc0: 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
cdd0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
cde0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
cdf0: 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
ce00: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
ce10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ce20: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
ce30: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
ce40: 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
ce50: 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
ce60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce70: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ce80: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
ce90: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
cea0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
ceb0: 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26  t->pCursor==0 &&
cec0: 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
ced0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
cee0: 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
cef0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20  pBt->pPager)>=1 
cf00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
cf10: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d  ->pPage1->aData=
cf20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  =0 ){.        Me
cf30: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
cf40: 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
cf50: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
cf60: 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67 65 29   = &((u8*)pPage)
cf70: 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  [-pBt->pageSize]
cf80: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
cf90: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
cfa0: 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
cfb0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
cfc0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
cfd0: 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
cfe0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67   }.    pBt->pPag
cff0: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
d000: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
d010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
d020: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d030: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
d040: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
d050: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
d060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
d070: 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
d080: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
d090: 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
d0a0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
d0b0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
d0c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d0d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d0e0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ex) );.  if( sql
d0f0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
d100: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
d110: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
d120: 45 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42  E_OK;.  pP1 = pB
d130: 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
d140: 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
d150: 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
d160: 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
d170: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
d180: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
d190: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d1a0: 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
d1b0: 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
d1c0: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
d1d0: 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
d1e0: 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
d1f0: 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
d200: 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
d210: 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
d220: 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
d230: 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
d240: 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70  ;.  data[20] = p
d250: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
d260: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d270: 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74    data[21] = pBt
d280: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a  ->maxEmbedFrac;.
d290: 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74    data[22] = pBt
d2a0: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a  ->minEmbedFrac;.
d2b0: 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74    data[23] = pBt
d2c0: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20  ->minLeafFrac;. 
d2d0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
d2e0: 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
d2f0: 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
d300: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
d310: 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
d320: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
d330: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
d340: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d350: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
d360: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
d370: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
d380: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
d390: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d3a0: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
d3b0: 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
d3c0: 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
d3d0: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
d3e0: 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
d3f0: 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
d400: 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
d410: 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
d420: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
d430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d440: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
d450: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
d460: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
d470: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
d480: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
d490: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
d4a0: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
d4b0: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
d4c0: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
d4d0: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
d4e0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
d4f0: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
d500: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
d510: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
d520: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
d530: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
d540: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
d550: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
d560: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
d570: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
d580: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
d590: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
d5a0: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
d5b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
d5c0: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
d5d0: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
d5e0: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
d5f0: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
d600: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
d610: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
d620: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
d630: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
d640: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
d650: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
d660: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
d670: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
d680: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
d690: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
d6a0: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
d6b0: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
d6c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d6d0: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
d6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
d6f0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
d700: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
d710: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
d720: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
d730: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
d740: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
d750: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
d760: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
d770: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
d780: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
d790: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
d7a0: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
d7b0: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
d7c0: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
d7d0: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
d7e0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
d7f0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
d800: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
d810: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
d820: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
d830: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
d840: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
d850: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
d860: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
d870: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
d880: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
d890: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
d8a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
d8b0: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
d8c0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
d8d0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
d8e0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
d8f0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
d900: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
d910: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
d920: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
d930: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
d940: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
d950: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
d960: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
d970: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
d980: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
d990: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
d9a0: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
d9b0: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
d9c0: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
d9d0: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
d9e0: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
d9f0: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
da00: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
da10: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
da20: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
da30: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
da40: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
da50: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
da60: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
da70: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
da80: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
da90: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
daa0: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
dab0: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
dac0: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
dad0: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
dae0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
daf0: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
db00: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
db10: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
db20: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
db30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
db40: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
db50: 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
db60: 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
db70: 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
db80: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
db90: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
dba0: 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
dbb0: 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
dbc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
dbd0: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
dbe0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
dbf0: 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
dc00: 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
dc10: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
dc20: 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
dc30: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
dc40: 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
dc50: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
dc60: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
dc70: 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
dc80: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
dc90: 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
dca0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
dcb0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
dcc0: 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
dcd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
dce0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
dcf0: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
dd00: 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  un;.  }..  /* If
dd10: 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
dd20: 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
dd30: 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
dd40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
dd50: 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
dd60: 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
dd70: 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
dd80: 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
dd90: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
dda0: 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
ddb0: 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a  LITE_BUSY..  */.
ddc0: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
ddd0: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
dde0: 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20  WRITE && wrflag 
ddf0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
de00: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
de10: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
de20: 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69   }..  do {.    i
de30: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
de40: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
de50: 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a  lockBtree(pBt);.
de60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
de70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
de80: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
de90: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
dea0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
deb0: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
dec0: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
ded0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dee0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
def0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
df00: 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  age, wrflag>1);.
df10: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
df20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
df30: 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
df40: 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
df50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
df60: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
df70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
df80: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  {.      if( wrfl
df90: 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ag ) pBt->inStmt
dfa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
dfb0: 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
dfc0: 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
dfd0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
dfe0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
dff0: 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
e000: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
e010: 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
e020: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
e030: 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42  yHandler(pBt->pB
e040: 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a  usyHandler) );..
e050: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e060: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
e070: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
e080: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
e090: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
e0a0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ++;.    }.    p-
e0b0: 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
e0c0: 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
e0d0: 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
e0e0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
e0f0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
e100: 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
e110: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
e120: 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
e130: 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
e140: 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65  gun:.  btreeInte
e150: 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
e160: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
e170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e180: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e190: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e1a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
e1b0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
e1c0: 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
e1d0: 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
e1e0: 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
e1f0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
e200: 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
e210: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
e220: 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
e230: 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
e240: 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
e250: 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
e260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e270: 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
e280: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
e290: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
e2c0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
e2d0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e300: 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
e310: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e340: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
e350: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e360: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
e370: 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
e380: 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
e390: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
e3a0: 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
e3b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e3c0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e3d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
e3e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
e3f0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
e400: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  Page->pParent);.
e410: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
e430: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
e440: 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
e450: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
e460: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
e470: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
e480: 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
e490: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
e4a0: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ;..    rc = ptrm
e4b0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
e4c0: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
e4d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e4e0: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
e4f0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
e500: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  s_out;.    }..  
e510: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
e520: 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
e530: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
e540: 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
e550: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
e560: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
e570: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
e580: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
e590: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e5a0: 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64  ) goto set_child
e5b0: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
e5c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
e5d0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
e5e0: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
e5f0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
e600: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
e610: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
e620: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
e630: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
e640: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
e650: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65  , pgno);.  }..se
e660: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
e670: 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
e680: 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
e690: 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
e6a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
e6b0: 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69  re on pPage, whi
e6c0: 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  ch is guarenteed
e6d0: 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70   to be a btree p
e6e0: 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72  age, not an over
e6f0: 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73  flow.** page, is
e700: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
e710: 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79  ge iFrom. Modify
e720: 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
e730: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
e740: 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d  to.** iTo. Param
e750: 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
e760: 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
e770: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d   pointer to be m
e780: 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20  odified, as .** 
e790: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
e7a0: 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
e7b0: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
e7c0: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
e7d0: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
e7e0: 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
e800: 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
e810: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
e820: 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
e830: 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
e840: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
e850: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
e880: 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
e890: 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
e8a0: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
e8b0: 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
e8c0: 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
e8d0: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
e8e0: 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
e8f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e900: 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
e910: 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
e920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
e930: 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
e940: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
e950: 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
e960: 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
e970: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
e980: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e990: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e9a0: 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
e9b0: 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
e9c0: 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
e9d0: 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
e9e0: 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
e9f0: 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
ea00: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
ea10: 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
ea20: 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
ea30: 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
ea40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ea50: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ea60: 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
ea70: 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
ea80: 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
ea90: 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67    int isInitOrig
eaa0: 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
eab0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
eac0: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
ead0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
eae0: 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
eaf0: 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
eb00: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
eb10: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
eb20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
eb30: 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
eb40: 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
eb50: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
eb60: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
eb70: 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
eb80: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
eb90: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
eba0: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
ebb0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
ebc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
ebd0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
ebe0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
ebf0: 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
ec00: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
ec10: 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
ec20: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
ec30: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
ec40: 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
ec50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ec60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec70: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
ec80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
ec90: 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
eca0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
ecb0: 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
ecc0: 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
ecd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ece0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ecf0: 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
ed00: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
ed10: 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
ed20: 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
ed30: 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
ed40: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
ed50: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
ed60: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
ed70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ed80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
ed90: 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
eda0: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
edb0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
edc0: 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
edd0: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
ede0: 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
edf0: 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
ee00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
ee10: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
ee20: 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
ee30: 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
ee40: 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
ee50: 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
ee60: 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
ee70: 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
ee80: 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  ns valid..*/.sta
ee90: 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
eea0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
eeb0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
eec0: 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
eed0: 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
eee0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
eef0: 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
ef00: 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
ef10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
ef20: 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
ef30: 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
ef40: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
ef50: 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
ef60: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
ef70: 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
ef80: 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
ef90: 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20   Pgno iFreePage 
efa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
efb0: 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
efc0: 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
efd0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
efe0: 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
eff0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
f000: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
f010: 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
f020: 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
f030: 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
f040: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
f050: 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
f060: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
f070: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
f080: 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
f090: 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
f0a0: 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
f0b0: 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
f0c0: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
f0d0: 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
f0e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f0f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
f100: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f110: 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
f120: 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
f130: 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
f140: 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65   from it's curre
f150: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
f160: 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
f170: 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
f180: 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
f190: 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
f1a0: 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
f1b0: 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
f1c0: 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
f1d0: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
f1e0: 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
f1f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f200: 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
f210: 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
f220: 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29  Page, iFreePage)
f230: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f240: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
f250: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
f260: 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
f270: 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
f280: 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
f290: 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
f2a0: 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
f2b0: 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
f2c0: 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
f2d0: 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
f2e0: 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
f2f0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
f300: 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
f310: 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
f320: 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
f330: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
f340: 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
f350: 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
f360: 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
f370: 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
f380: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
f390: 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
f3a0: 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
f3b0: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
f3c0: 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
f3d0: 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
f3e0: 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
f3f0: 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
f400: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
f410: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
f420: 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
f430: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
f440: 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
f450: 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
f460: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
f470: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f480: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f490: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
f4a0: 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
f4b0: 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
f4c0: 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
f4d0: 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
f4e0: 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
f4f0: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
f500: 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
f510: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
f520: 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
f530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f540: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
f550: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
f560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f570: 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
f580: 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
f590: 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
f5a0: 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
f5b0: 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
f5c0: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
f5d0: 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
f5e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
f5f0: 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
f600: 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
f610: 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
f620: 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
f630: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
f640: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
f650: 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
f660: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
f670: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f690: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
f6a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
f6b0: 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
f6c0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
f6d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f6e0: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
f6f0: 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
f700: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f710: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
f720: 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
f730: 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
f740: 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
f750: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
f760: 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
f770: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f790: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
f7a0: 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
f7b0: 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
f7c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f7d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
f7e0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
f7f0: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
f800: 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
f810: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
f820: 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
f830: 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
f840: 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
f850: 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
f860: 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
f870: 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
f880: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
f890: 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
f8a0: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
f8b0: 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
f8c0: 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
f8d0: 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
f8e0: 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
f8f0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
f900: 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
f910: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
f920: 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
f930: 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
f940: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
f950: 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
f960: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
f970: 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
f980: 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
f990: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
f9a0: 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
f9b0: 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
f9c0: 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
f9d0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
f9e0: 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
f9f0: 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
fa00: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
fa10: 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
fa20: 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
fa30: 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
fa40: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
fa50: 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
fa60: 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
fa70: 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
fa80: 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
fa90: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
faa0: 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
fab0: 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
fac0: 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
fad0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
fae0: 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
faf0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
fb00: 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74  n){.  Pgno iLast
fb10: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
fb20: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
fb30: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
fb40: 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
fb50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
fb60: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
fb70: 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
fb80: 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
fb90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fba0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
fbb0: 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67 20  x) );.  iLastPg 
fbc0: 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
fbd0: 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20   if( iLastPg==0 
fbe0: 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d  ){.    iLastPg =
fbf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
fc00: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
fc10: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
fc20: 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
fc30: 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
fc40: 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
fc50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
fc60: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
fc70: 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
fc80: 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
fc90: 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
fca0: 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
fcb0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
fcc0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
fcd0: 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e  eList==0 || nFin
fce0: 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20  ==iLastPg ){.   
fcf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd00: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fd10: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
fd20: 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
fd30: 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
fd40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
fd50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fd70: 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
fd80: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
fd90: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
fda0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fdb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
fdc0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
fdd0: 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
fde0: 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
fdf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
fe00: 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
fe10: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
fe20: 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
fe30: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
fe40: 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
fe50: 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
fe60: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
fe70: 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
fe80: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
fe90: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
fea0: 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
feb0: 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
fec0: 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
fed0: 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
fee0: 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
fef0: 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
ff00: 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
ff10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
ff20: 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
ff30: 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
ff40: 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
ff50: 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
ff60: 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
ff70: 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
ff80: 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
ff90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ffa0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
ffb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
ffc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
ffd0: 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
ffe0: 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
fff0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
10000 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
10010 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
10020 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
10030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10040 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
10050 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
10060 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
10070 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
10080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10090 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
100a0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
100b0 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
100c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
100d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
100e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
100f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
10100 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
10110 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
10120 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
10130 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
10140 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
10150 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
10160 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
10170 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
10180 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10190 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
101a0 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
101b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
101c0 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
101d0 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
101e0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
101f0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
10200 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
10210 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
10220 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
10230 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
10240 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
10250 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
10260 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
10270 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
10280 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
10290 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
102a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
102b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
102c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
102d0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
102e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
102f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
10300 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10310 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
10320 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
10330 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
10340 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10350 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
10360 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
10370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10380 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
10390 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
103a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
103b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
103c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
103d0 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  } .      rc = re
103e0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
103f0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
10400 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
10410 67 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  g);.      releas
10420 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
10430 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10460 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d      } .    }.  }
10470 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  ..  pBt->nTrunc 
10480 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20  = iLastPg - 1;. 
10490 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72   while( pBt->nTr
104a0 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  unc==PENDING_BYT
104b0 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
104c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
104d0 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a  pBt->nTrunc) ){.
104e0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d      pBt->nTrunc-
104f0 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
10500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10510 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
10520 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
10530 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
10540 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
10550 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
10560 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
10570 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
10580 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
10590 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
105a0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
105b0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
105c0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
105d0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
105e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
105f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
10600 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
10610 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
10620 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51  r occured,.** SQ
10630 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
10640 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
10650 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
10660 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
10670 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
10680 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
10690 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
106a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
106b0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
106c0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
106d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
106e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
106f0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
10700 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
10710 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
10720 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
10730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
10740 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
10750 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
10760 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
10770 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56  ;.    rc = incrV
10780 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30  acuumStep(pBt, 0
10790 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
107a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
107b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
107c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
107d0 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
107e0 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
107f0 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
10800 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
10810 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
10820 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
10830 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
10840 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
10850 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
10860 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
10870 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
10880 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
10890 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
108a0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
108b0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
108c0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
108d0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
108e0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
108f0 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
10900 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
10910 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
10920 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
10930 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
10940 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
10950 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e  d *pBt, Pgno *pn
10960 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
10970 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10980 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
10990 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66  pBt->pPager;.#if
109a0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
109b0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
109c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
109d0 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
109e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
109f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10a00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
10a10 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
10a20 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
10a30 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
10a40 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
10a50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
10a60 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
10a70 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
10a80 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b  Bt->nTrunc==0 ){
10a90 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  .      Pgno nFre
10aa0 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  e;.      Pgno nP
10ab0 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e  trmap;.      con
10ac0 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
10ad0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
10ae0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
10af0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10b00 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10b10 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50  r);..      if( P
10b20 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
10b30 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20  , nOrig) ){.    
10b40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10b50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10b70 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  ( nOrig==PENDING
10b80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
10b90 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67  ){.        nOrig
10ba0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10bb0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
10bc0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
10bd0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
10be0 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
10bf0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
10c00 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
10c10 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
10c20 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e  z/5);.      nFin
10c30 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
10c40 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
10c50 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
10c60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
10c70 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44  t) && nFin<=PEND
10c80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
10c90 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46  t) ){.        nF
10ca0 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  in--;.      }.  
10cb0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
10cc0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
10cd0 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
10ce0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
10cf0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
10d00 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
10d10 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
10d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
10d40 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
10d50 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   nFin);.    }.  
10d60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10d70 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61  _DONE ){.      a
10d80 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c  ssert(nFin==0 ||
10d90 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20   pBt->nTrunc==0 
10da0 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54  || nFin<=pBt->nT
10db0 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20  runc);.      rc 
10dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10dd0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
10de0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  nc ){.        rc
10df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
10e00 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
10e10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
10e20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
10e30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
10e40 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
10e50 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
10e60 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
10e70 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  6], 0);.        
10e80 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46  pBt->nTrunc = nF
10e90 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
10ea0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
10eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
10ed0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
10ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
10ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10f00 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20  .    *pnTrunc = 
10f10 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20  pBt->nTrunc;.   
10f20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
10f30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10f40 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
10f50 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
10f60 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
10f70 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  c;.}..#endif../*
10f80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10f90 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
10fa0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
10fb0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
10fc0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
10fd0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
10fe0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
10ff0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
11000 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
11010 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
11020 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
11030 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
11040 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
11050 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
11060 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
11070 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
11080 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
11090 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
110a0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
110b0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
110c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
110d0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
110e0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
110f0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
11100 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
11110 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
11120 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
11130 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
11140 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
11150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
11160 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
11170 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
11180 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
11190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
111a0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
111b0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
111c0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
111d0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
111e0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
111f0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
11200 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
11210 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
11220 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20  ommit() for the 
11230 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
11240 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
11250 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
11260 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
11270 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
11280 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
11290 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
112a0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
112b0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
112c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
112d0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
112e0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
112f0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
11300 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
11310 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
11320 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
11330 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
11340 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
11350 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
11360 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
11370 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11380 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
11390 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
113a0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
113b0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
113c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
113d0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
113e0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
113f0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
11400 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
11410 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
11420 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
11430 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
11440 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
11450 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
11460 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
11470 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
11480 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
11490 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
114a0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
114b0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
114c0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
114d0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
114e0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
114f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
11500 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
11510 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11520 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
11530 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
11540 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11550 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67  = p->pBt;.    Pg
11560 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  no nTrunc = 0;. 
11570 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
11580 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
11590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
115a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
115b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
115c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
115d0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
115e0 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20  Bt, &nTrunc); . 
115f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11610 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11620 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
11630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11640 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
11650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11660 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
11670 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
11680 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
11690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
116a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
116b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
116c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
116d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
116e0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
116f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
11700 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
11710 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
11720 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
11730 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
11740 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11750 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  c() routine does
11760 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
11770 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69   and should be i
11780 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20  nvoked.** prior 
11790 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
117a0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
117b0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
117c0 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20   routine did.** 
117d0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
117e0 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
117f0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
11800 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
11810 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
11820 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
11830 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
11840 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
11850 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
11860 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
11870 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
11880 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  e the rollback j
11890 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68  ournal.** (which
118a0 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
118b0 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
118c0 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b  t) and drop lock
118d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
118e0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
118f0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
11900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11910 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
11920 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
11930 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
11940 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
11950 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
11960 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11970 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b  seTwo(Btree *p){
11980 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11990 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
119a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
119b0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
119c0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
119d0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
119e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
119f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
11a00 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
11a10 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
11a20 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
11a30 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
11a40 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
11a50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
11a60 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
11a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
11a80 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
11a90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11aa0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
11ab0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
11ac0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
11ad0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
11ae0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
11af0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
11b00 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
11b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11b20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11b30 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
11b40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
11b50 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
11b60 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
11b70 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
11b80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
11b90 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
11ba0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
11bb0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
11bc0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
11bd0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
11be0 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
11bf0 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
11c00 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
11c10 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
11c20 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
11c30 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
11c40 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
11c50 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
11c60 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
11c70 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
11c80 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
11c90 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
11ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11cb0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
11cc0 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
11cd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
11ce0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
11cf0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
11d00 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
11d10 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
11d20 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
11d30 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
11d40 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
11d50 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
11d60 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
11d70 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
11d80 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
11d90 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
11da0 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
11db0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
11dc0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61  .  */.  p->inTra
11dd0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
11de0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
11df0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
11e00 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
11e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11e20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11e40 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
11e50 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
11e60 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
11e70 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
11e80 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
11e90 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
11ea0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
11eb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
11ec0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
11ed0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
11ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11ef0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11f00 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
11f10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11f20 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11f40 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
11f50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
11f60 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
11f70 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
11f80 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
11f90 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
11fa0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
11fb0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
11fc0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
11fd0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
11fe0 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  ** defined..*/.s
11ff0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
12000 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
12010 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
12020 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
12030 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
12040 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
12050 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
12060 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
12070 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
12080 67 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  g ) r++; .  }.  
12090 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
120a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  if../*.** Rollba
120b0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
120c0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
120d0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
120e0 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
120f0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
12100 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
12110 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
12120 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
12130 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
12140 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
12150 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
12160 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
12170 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
12180 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
12190 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
121a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
121b0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
121c0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
121d0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
121e0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
121f0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
12200 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
12210 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
12220 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
12230 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12240 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
12250 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
12260 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
12270 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
12280 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
12290 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
122a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
122b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
122c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
122d0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
122e0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
122f0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12300 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
12310 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
12320 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
12330 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
12340 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
12350 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
12360 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
12370 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
12380 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
12390 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
123a0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
123b0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
123c0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
123d0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
123e0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
123f0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
12400 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
12410 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
12420 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
12430 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
12440 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
12450 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
12460 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
12470 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
12480 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
12490 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43 75   while( pBt->pCu
124a0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71  rsor ){.      sq
124b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d  lite3 *db = pBt-
124c0 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65  >pCursor->pBtree
124d0 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20 20  ->pSqlite;.     
124e0 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 20   if( db ){.     
124f0 20 20 20 2f 2a 2a 2a 2a 20 46 49 58 20 4d 45 3a     /**** FIX ME:
12500 20 54 68 69 73 20 63 61 6e 20 64 65 61 64 6c 6f   This can deadlo
12510 63 6b 20 2a 2a 2a 2a 2f 0a 20 20 20 20 20 20 20  ck ****/.       
12520 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12530 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12550 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65  AbortOtherActive
12560 56 64 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  Vdbes(db, 0);.  
12570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12580 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12590 74 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tex);.      }.  
125a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
125b0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
125c0 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
125d0 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
125e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
125f0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
12600 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65  int rc2;..#ifnde
12610 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12620 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
12630 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65  ->nTrunc = 0;.#e
12640 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
12650 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
12660 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12670 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
12680 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
12690 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
126a0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
126b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
126c0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
126d0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
126e0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
126f0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
12700 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
12710 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
12720 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
12730 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
12740 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
12750 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
12760 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
12770 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
12780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12790 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
127a0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
127b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
127c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
127d0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
127e0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
127f0 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
12800 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
12810 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
12820 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
12830 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
12840 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
12850 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
12860 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
12870 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
12880 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
12890 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
128a0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
128b0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
128c0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
128d0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
128e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
128f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
12900 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
12910 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
12920 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
12930 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
12940 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12950 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12960 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
12970 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
12980 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
12990 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
129a0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
129b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
129c0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
129d0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
129e0 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
129f0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
12a00 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
12a10 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
12a20 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
12a30 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
12a40 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
12a50 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
12a60 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
12a70 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
12a80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
12a90 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
12aa0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
12ab0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
12ac0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
12ad0 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
12ae0 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
12af0 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
12b00 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
12b10 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
12b20 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
12b30 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
12b40 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
12b50 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
12b60 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
12b70 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
12b80 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
12b90 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
12ba0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
12bb0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
12bc0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
12bd0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
12be0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
12bf0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
12c00 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
12c10 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
12c20 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
12c30 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
12c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12c50 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
12c60 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
12c70 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
12c80 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12c90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ca0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  r(p);.  if( (p->
12cb0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
12cc0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
12cd0 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Stmt ){.    rc =
12ce0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
12cf0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12d00 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
12d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
12d20 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
12d30 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
12d40 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20  WRITE );.    rc 
12d50 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
12d60 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
12d70 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
12d80 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
12d90 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
12da0 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 1;.  }.  sql
12db0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12dd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
12de0 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75   the statment su
12df0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72  btransaction cur
12e00 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
12e10 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ss.  If no.** su
12e20 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
12e30 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20  active, this is 
12e40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
12e50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12e60 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  itStmt(Btree *p)
12e70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
12e80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12e90 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
12ea0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12eb0 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
12ec0 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
12ed0 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
12ee0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
12ef0 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
12f00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12f20 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d    }.  pBt->inStm
12f30 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
12f40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12f60 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
12f70 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  e active stateme
12f80 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
12f90 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61  n.  If no subtra
12fa0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  nsaction.** is a
12fb0 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69  ctive this routi
12fc0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12fd0 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  *.** All cursors
12fe0 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
12ff0 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ated by this ope
13000 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
13010 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61  empt.** to use a
13020 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73   cursor that was
13030 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
13040 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
13050 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  peration.** will
13060 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
13070 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
13080 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
13090 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
130a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
130b0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
130c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
130d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
130e0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
130f0 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28  3MallocDisallow(
13100 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
13110 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
13120 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
13130 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
13140 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  tmtRollback(pBt-
13150 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  >pPager);.    as
13160 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
13170 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
13180 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  );.    pBt->inSt
13190 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  mt = 0;.  }.  sq
131a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77  lite3MallocAllow
131b0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ();.  sqlite3Btr
131c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
131d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
131e0 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f  * Default key co
131f0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
13200 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69 66 20  n to be used if 
13210 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  no comparison fu
13220 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65  nction.** is spe
13230 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71  cified on the sq
13240 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
13250 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  () call..*/.stat
13260 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61  ic int dfltCompa
13270 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  re(.  void *NotU
13280 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  sed,            
13290 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 69 73   /* User data is
132a0 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69   not used */.  i
132b0 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nt n1, const voi
132c0 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72  d *p1,    /* Fir
132d0 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  st key to compar
132e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63  e */.  int n2, c
132f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20  onst void *p2   
13300 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20    /* Second key 
13310 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b  to compare */.){
13320 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20  .  int c;.  c = 
13330 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e  memcmp(p1, p2, n
13340 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b  1<n2 ? n1 : n2);
13350 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
13360 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a     c = n1 - n2;.
13370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a    }.  return c;.
13380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
13390 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
133a0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
133b0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
133c0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
133d0 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75   The act of acqu
133e0 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67  iring a cursor g
133f0 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ets a read lock 
13400 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
13410 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
13420 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
13430 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
13440 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
13450 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
13460 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
13470 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
13480 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
13490 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
134a0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
134b0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
134c0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
134d0 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
134e0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
134f0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
13500 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
13510 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
13520 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
13530 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
13540 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
13550 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
13560 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
13570 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
13580 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
13590 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
135a0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
135b0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
135c0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
135d0 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
135e0 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
135f0 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
13600 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
13610 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
13620 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
13630 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
13640 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
13650 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
13660 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
13670 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
13680 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
13690 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
136a0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
136b0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
136c0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
136d0 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
136e0 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
136f0 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
13700 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
13710 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
13720 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
13730 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
13740 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
13750 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
13760 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
13770 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
13780 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
13790 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
137a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
137b0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
137c0 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** The compariso
137d0 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  n function must 
137e0 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65  be logically the
137f0 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20   same for every 
13800 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70  cursor.** on a p
13810 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
13820 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63    Changing the c
13830 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
13840 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13850 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f  * in incorrect o
13860 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74  perations.  If t
13870 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
13880 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
13890 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d  a.** default com
138a0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
138b0 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20 63   is used.  The c
138c0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
138d0 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  on is.** always 
138e0 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b  ignored for INTK
138f0 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  EY tables..*/.st
13900 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
13910 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
13920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
13950 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
13960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
13990 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
139a0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
139e0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
139f0 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69   int (*xCmp)(voi
13a00 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
13a10 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
13a20 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70  d*), /* Key Comp
13a30 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20  arison func */. 
13a40 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20   void *pArg,    
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a70 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
13a80 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
13a90 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20  ursor **ppCur   
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
13ac0 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
13ad0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
13ae0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
13af0 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ur;.  BtShared *
13b00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
13b10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13b20 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
13b30 70 29 20 29 3b 0a 20 20 2a 70 70 43 75 72 20 3d  p) );.  *ppCur =
13b40 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   0;.  if( wrFlag
13b50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
13b60 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
13b70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13b80 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
13b90 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
13ba0 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
13bb0 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
13bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
13bd0 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
13be0 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
13bf0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
13c00 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
13c10 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
13c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13c30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13c50 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
13c60 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
13c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
13c80 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
13c90 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
13ca0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
13cb0 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a  izeof(*pCur) );.
13cc0 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 7b    if( pCur==0 ){
13cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13ce0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
13cf0 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
13d00 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
13d10 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
13d20 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
13d30 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
13d40 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
13d50 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
13d60 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ger)==0 ){.    r
13d70 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
13d80 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
13d90 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
13da0 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  on;.  }.  rc = g
13db0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
13dc0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
13dd0 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
13de0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
13df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13e00 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
13e10 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
13e20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
13e30 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
13e40 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
13e50 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
13e60 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
13e70 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
13e80 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
13e90 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
13ea0 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
13eb0 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
13ec0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
13ed0 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
13ee0 2a 2f 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70  */.  pCur->xComp
13ef0 61 72 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d  are = xCmp ? xCm
13f00 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b  p : dfltCompare;
13f10 0a 20 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20  .  pCur->pArg = 
13f20 70 41 72 67 3b 0a 20 20 70 43 75 72 2d 3e 70 42  pArg;.  pCur->pB
13f30 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
13f40 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
13f50 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72  Cur->wrFlag = wr
13f60 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
13f70 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
13f80 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
13f90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
13fa0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
13fb0 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
13fc0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
13fd0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
13fe0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
13ff0 49 44 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20 70  ID;.  *ppCur = p
14000 43 75 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  Cur;..  return S
14010 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74  QLITE_OK;..creat
14020 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
14030 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  on:.  if( pCur )
14040 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
14050 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
14060 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14070 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e  (pCur);.  }.  un
14080 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
14090 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  d(pBt);.  return
140a0 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
140b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
140c0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
140f0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
14100 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
14130 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
14140 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
14150 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
14180 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
14190 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  only */.  int (*
141a0 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xCmp)(void*,int,
141b0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
141c0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a  const void*), /*
141d0 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20   Key Comparison 
141e0 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  func */.  void *
141f0 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
14220 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
14230 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
14240 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20 20  *ppCur          
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
14270 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
14280 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
14290 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
142a0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
142b0 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
142c0 20 77 72 46 6c 61 67 2c 20 78 43 6d 70 2c 20 70   wrFlag, xCmp, p
142d0 41 72 67 2c 20 70 70 43 75 72 29 3b 0a 20 20 73  Arg, ppCur);.  s
142e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
142f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14300 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ;.}.../*.** Clos
14310 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
14320 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
14330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14340 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
14350 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
14360 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
14370 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14380 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
14390 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
143a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
143b0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
143c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
143d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
143e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
143f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
14400 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  ur->pBtree->pSql
14410 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
14420 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
14430 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
14440 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
14450 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76  .    pCur->pPrev
14460 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
14470 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
14480 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
14490 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
144a0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
144b0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
144c0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
144d0 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
144e0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
144f0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
14500 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
14510 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76  used(pBt);.  inv
14520 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
14530 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 73 71  ache(pCur);.  sq
14540 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
14550 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14560 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
14570 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
14580 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
14590 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
145a0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
145b0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
145c0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
145d0 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
145e0 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
145f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
14600 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
14610 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
14620 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
14630 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
14640 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
14650 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
14660 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
14670 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
14680 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
14690 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
146a0 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
146b0 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
146c0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
146d0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
146e0 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
146f0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
14700 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
14710 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
14720 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
14730 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
14740 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
14750 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
14760 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14770 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
14780 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
14790 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
147a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
147b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
147c0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
147d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
147e0 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
147f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
14800 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
14810 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
14820 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
14830 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
14840 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
14850 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
14860 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
14870 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
14880 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
14890 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
148a0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
148b0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
148c0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
148d0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
148e0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
148f0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
14900 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
14910 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
14920 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
14930 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
14940 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
14950 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
14960 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
14970 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
14980 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
14990 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
149a0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
149b0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
149c0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
149d0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
149e0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
149f0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
14a00 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
14a10 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
14a20 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
14a30 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
14a40 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
14a50 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
14a60 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
14a70 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
14a80 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
14a90 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
14aa0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
14ab0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
14ac0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
14ad0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
14ae0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
14af0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
14b00 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
14b10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
14b20 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
14b30 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
14b40 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
14b50 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
14b60 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
14b70 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
14b80 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
14b90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
14ba0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
14bb0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
14bc0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
14bd0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
14be0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
14bf0 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
14c00 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
14c10 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
14c20 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
14c30 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
14c40 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
14c50 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
14c60 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
14c70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
14c80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
14c90 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
14ca0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14cb0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
14cc0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
14cd0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
14ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14cf0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
14d00 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
14d10 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
14d20 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
14d30 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
14d40 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
14d50 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
14d60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
14d70 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
14d80 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
14d90 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
14dd0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
14e10 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
14e20 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
14e30 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
14e40 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
14e50 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
14ea0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
14eb0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
14ef0 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
14f00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
14f10 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
14f20 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
14f30 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
14f40 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
14f50 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
14f60 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
14f70 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
14f80 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
14f90 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
14fa0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
14fb0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
14fc0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
14fd0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
14fe0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
14ff0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
15000 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
15010 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15020 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
15030 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15040 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
15050 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
15060 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
15070 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
15080 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15090 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
150a0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
150b0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
150c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
150d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
150e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
150f0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15100 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
15110 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
15120 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
15130 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15140 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
15150 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
15160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
15170 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
15180 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
15190 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
151a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
151b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
151c0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
151d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
151e0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
151f0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
15200 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
15210 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
15220 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
15230 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
15240 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
15250 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
15260 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
15270 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
15280 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
15290 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
152a0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
152b0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
152c0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
152d0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
152e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
152f0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
15300 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
15310 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
15320 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
15330 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15340 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
15350 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
15360 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15370 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
15390 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
153a0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
153b0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
153c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
153d0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
153e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
153f0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
15400 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
15410 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
15420 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
15430 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
15440 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
15450 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
15460 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
15470 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
15480 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
15490 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
154a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
154b0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
154c0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
154d0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
154e0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
154f0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
15500 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
15510 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15520 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
15530 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
15540 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
15550 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
15560 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
15570 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
15580 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
15590 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
155a0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
155b0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
155c0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
155d0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
155e0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
155f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
15600 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15610 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70  :.**.** Unless p
15620 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
15630 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  , the page numbe
15640 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
15650 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20  erflow .** page 
15660 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
15670 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  st is written to
15680 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
15690 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20  page ovfl.** is 
156a0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
156b0 20 69 74 27 73 20 6c 69 6e 6b 65 64 20 6c 69 73   it's linked lis
156c0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
156d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
156e0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
156f0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50  s not NULL, *ppP
15700 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  age is set to th
15710 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c  e MemPage* handl
15720 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76  e.** for page ov
15730 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69  fl. The underlyi
15740 6e 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61  ng pager page ma
15750 79 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  y have been requ
15760 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  ested.** with th
15770 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
15780 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67   set, so the pag
15790 65 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c  e data accessabl
157a0 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61  e via.** this ha
157b0 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  ndle may not be 
157c0 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  trusted..*/.stat
157d0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
157e0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
157f0 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
15800 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
15810 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
15820 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
15830 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
15840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15850 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
15860 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  le */.  Pgno *pP
15870 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
15880 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
15890 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
158a0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
158b0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
158c0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
158d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
158e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
158f0 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66  ) );.  /* One of
15900 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20   these must not 
15910 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  be NULL. Otherwi
15920 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69  se, why call thi
15930 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20  s function? */. 
15940 20 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c   assert(ppPage |
15950 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20  | pPgnoNext);.. 
15960 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74   /* If pPgnoNext
15970 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
15980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15990 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20  being called to 
159a0 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65  obtain.  ** a Me
159b0 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65  mPage* reference
159c0 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64   only. No page-d
159d0 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
159e0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
159f0 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e  */.  if( !pPgnoN
15a00 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ext ){.    retur
15a10 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n sqlite3BtreeGe
15a20 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
15a30 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d   ppPage, 1);.  }
15a40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15a50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
15a60 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
15a70 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
15a80 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
15a90 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
15aa0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
15ab0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
15ac0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
15ad0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
15ae0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
15af0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
15b00 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
15b10 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
15b20 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
15b30 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
15b40 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
15b50 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
15b60 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
15b70 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
15b80 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
15b90 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
15ba0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
15bb0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
15bc0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
15bd0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
15be0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
15bf0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
15c00 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
15c10 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
15c20 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
15c30 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
15c40 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
15c50 20 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c   if( iGuess<=sql
15c60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
15c70 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
15c80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
15c90 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
15ca0 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
15cb0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
15cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15cd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15ce0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
15cf0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
15d00 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
15d10 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
15d20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
15d30 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ess;.      }.   
15d40 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
15d50 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20   if( next==0 || 
15d60 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65  ppPage ){.    Me
15d70 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
15d80 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
15d90 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
15da0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
15db0 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20  e, next!=0);.   
15dc0 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
15dd0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
15de0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  0);.    if( next
15df0 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
15e00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
15e10 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
15e20 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
15e30 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61   }..    if( ppPa
15e40 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  ge ){.      *ppP
15e50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20  age = pPage;.   
15e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
15e70 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
15e80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
15e90 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
15ea0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15eb0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
15ec0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
15ed0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
15ee0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
15ef0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
15f00 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
15f10 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
15f20 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
15f30 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
15f40 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
15f50 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
15f60 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
15f70 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
15f80 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
15f90 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
15fa0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
15fb0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
15fc0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
15fd0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
15fe0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
15ff0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
16000 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
16010 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
16020 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
16030 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
16040 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16050 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
16060 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
16070 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
16080 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
16090 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
160a0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
160b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
160c0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
160d0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
160e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
160f0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
16100 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
16110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16120 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
16130 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
16140 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
16150 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
16160 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
16170 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
16180 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
16190 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
161a0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
161b0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
161c0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
161d0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
161e0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
161f0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
16200 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
16210 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
16220 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
16230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16260 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
16270 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
16280 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
16290 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
162a0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
162b0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
162c0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
162d0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
162e0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
162f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16300 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
16310 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
16320 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
16330 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
16340 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
16350 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
16360 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
16370 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
16380 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
16390 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
163a0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
163b0 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
163c0 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
163d0 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
163e0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
163f0 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
16400 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
16410 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
16420 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
16430 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
16440 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
16450 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
16460 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
16470 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
16480 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
16490 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
164a0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
164b0 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65  a distinction be
164c0 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  tween key and da
164d0 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72  ta..** It just r
164e0 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62  eads or writes b
164f0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ytes from the pa
16500 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74  yload area.  Dat
16510 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65  a might .** appe
16520 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
16530 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65  age or be scatte
16540 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
16550 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ple overflow .**
16560 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
16570 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
16580 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
16590 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
165a0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
165b0 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
165c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
165d0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
165e0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
165f0 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
16600 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
16610 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
16620 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
16630 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
16640 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
16650 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
16660 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
16670 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
16680 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
16690 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
166a0 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
166b0 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
166c0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
166d0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
166e0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
166f0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
16700 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
16710 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
16720 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
16730 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
16740 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
16750 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
16760 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
16770 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
16780 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
16790 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
167a0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
167b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
167c0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
167d0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
167e0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
167f0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
16800 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
16810 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
16820 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
16830 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
16840 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
16850 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
16860 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
16870 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
16880 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
16890 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
168a0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
168b0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  m */.  int offse
168c0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
168d0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
168e0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
168f0 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  ad */.  int amt,
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16910 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
16920 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
16930 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
16940 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
16950 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
16960 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
16970 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  pKey,         /*
16980 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
16990 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
169a0 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
169b0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
169c0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
169d0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
169e0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
169f0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
16a00 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
16a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
16a20 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
16a30 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
16a40 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
16a50 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 42  >pPage;     /* B
16a60 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
16a70 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
16a80 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
16a90 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
16aa0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  ;        /* Btre
16ab0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
16ac0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
16ad0 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
16ae0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
16af0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
16b00 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
16b10 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
16b20 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
16b30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
16b40 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
16b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
16b60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
16b70 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
16b80 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
16b90 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
16ba0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
16bb0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
16bc0 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
16bd0 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70  ->intKey ? 0 : p
16be0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
16bf0 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
16c00 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
16c10 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
16c20 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
16c30 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
16c40 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ata ){.    /* Tr
16c50 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
16c60 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
16c70 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
16c80 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
16c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ca0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
16cb0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
16cc0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
16cd0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
16ce0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
16cf0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
16d00 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
16d10 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
16d20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
16d30 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
16d40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
16d50 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
16d60 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
16d70 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
16d80 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
16d90 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
16da0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
16db0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
16dc0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
16dd0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
16de0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
16df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
16e00 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
16e10 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
16e20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16e30 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
16e40 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c    const int ovfl
16e50 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
16e60 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
16e70 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
16e80 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
16e90 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
16ea0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
16eb0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
16ec0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
16ed0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
16ee0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
16ef0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
16f00 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
16f10 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
16f20 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
16f30 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
16f40 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
16f50 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
16f60 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
16f70 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
16f80 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
16f90 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
16fa0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
16fb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
16fc0 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
16fd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
16fe0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
16ff0 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
17000 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
17010 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
17020 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
17030 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
17040 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
17050 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
17060 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
17070 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
17080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17090 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
170a0 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
170b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
170c0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
170d0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
170e0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
170f0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
17100 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
17110 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
17120 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
17130 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
17140 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
17150 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  fl);.      if( n
17160 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61  Ovfl && !pCur->a
17170 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
17180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17190 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
171a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
171b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
171c0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
171d0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
171e0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
171f0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
17200 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
17210 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
17220 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
17230 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
17240 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17250 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
17260 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
17270 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
17280 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
17290 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
172a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
172b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
172c0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
172d0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
172e0 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
172f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
17300 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
17310 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
17320 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
17330 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
17340 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
17350 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
17360 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
17370 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
17380 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
17390 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
173a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
173b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
173c0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
173d0 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
173e0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
173f0 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
17400 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
17410 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
17420 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
17430 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
17440 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
17450 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
17460 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
17470 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
17480 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
17490 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
174a0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
174b0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
174c0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
174d0 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
174e0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
174f0 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
17500 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
17510 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
17520 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
17530 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
17540 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
17550 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
17560 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
17570 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
17580 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
17590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
175a0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
175b0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
175c0 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
175d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
175e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
175f0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
17600 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
17610 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
17620 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
17630 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
17640 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
17650 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
17660 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  ge);.        off
17670 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
17680 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17690 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
176a0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
176b0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
176c0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
176d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
176e0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
176f0 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
17700 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
17710 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
17720 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44      */.        D
17730 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
17740 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
17750 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  amt;.        rc 
17760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
17770 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
17780 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
17790 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
177a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
177b0 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c  .          aPayl
177c0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
177d0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
177e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  e);.          ne
177f0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
17800 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
17810 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
17820 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
17830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17840 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
17850 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
17860 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
17870 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
17880 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
17890 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
178a0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
178b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
178c0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
178d0 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
178e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
178f0 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
17900 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
17910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17920 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
17930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17940 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
17950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17960 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
17970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17980 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
17990 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
179a0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
179b0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
179c0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
179d0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
179e0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
179f0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
17a00 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
17a10 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
17a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
17a30 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
17a40 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
17a50 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
17a60 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
17a70 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
17a80 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
17a90 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
17aa0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
17ab0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17ac0 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
17ad0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
17ae0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
17af0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
17b00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
17b10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
17b20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
17b30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
17b40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
17b50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
17b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
17b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
17b90 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
17ba0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
17bb0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  0 );.    if( pCu
17bc0 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
17bd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17be0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17bf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
17c00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
17c10 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  age->intKey==0 )
17c20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
17c30 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
17c40 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
17c50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
17c60 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
17c70 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
17c80 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
17c90 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
17ca0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
17cb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17cc0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
17cd0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
17ce0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
17cf0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
17d00 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
17d10 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
17d20 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
17d30 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
17d40 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
17d50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
17d60 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
17d70 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
17d80 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
17d90 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
17da0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
17db0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
17dc0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
17dd0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
17de0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
17df0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
17e00 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
17e10 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
17e20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
17e30 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
17e40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
17e50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
17e60 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
17e70 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
17e80 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
17e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
17eb0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
17ec0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
17ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
17ee0 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
17ef0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
17f00 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
17f10 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
17f20 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
17f30 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
17f40 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
17f50 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29  amt, pBuf, 1, 0)
17f60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17f70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17f80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17f90 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
17fa0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
17fb0 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
17fc0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
17fd0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
17fe0 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
17ff0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
18000 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
18010 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
18020 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
18030 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
18040 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
18050 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
18060 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
18070 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
18080 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
18090 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
180a0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
180b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
180c0 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
180d0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
180e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
180f0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
18100 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
18110 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
18120 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
18130 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
18140 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
18150 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
18160 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
18170 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
18180 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
18190 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
181a0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
181b0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
181c0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
181d0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
181e0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
181f0 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
18200 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
18210 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
18220 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
18230 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68  reassembly.** th
18240 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
18250 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
18260 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
18270 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
18280 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
18290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
182a0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
182b0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
182c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
182d0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
182e0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
182f0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
18300 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
18310 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
18320 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
18330 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18340 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
18350 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18360 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
18370 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
18380 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
18390 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
183a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
183b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
183c0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
183d0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
183e0 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
183f0 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
18400 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
18410 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
18420 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18430 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
18440 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
18450 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  32 nKey;.  int n
18460 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
18470 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
18480 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
18490 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
184a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
184b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
184c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
184d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
184e0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
184f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
18500 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18510 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
18520 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ll );.  getCellI
18530 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
18540 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
18550 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
18560 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
18570 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
18580 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
18590 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
185a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
185b0 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
185c0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
185d0 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
185e0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
185f0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
18600 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
18610 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
18620 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
18630 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
18640 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
18650 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
18660 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
18670 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
18680 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
18690 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
186a0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
186b0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
186c0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
186d0 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
186e0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
186f0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
18700 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
18710 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
18720 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
18730 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
18740 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
18750 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
18760 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
18770 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
18780 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
18790 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
187a0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
187b0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
187c0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
187d0 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
187e0 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
187f0 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
18800 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
18810 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
18820 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
18830 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
18840 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
18850 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
18860 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
18870 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
18880 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
18890 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
188a0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
188b0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
188c0 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
188d0 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
188e0 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
188f0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
18900 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
18910 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
18920 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
18930 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
18940 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
18950 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18960 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
18970 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
18980 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
18990 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
189a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63  .  return 0;.}.c
189b0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
189c0 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
189d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
189e0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61   int *pAmt){.  a
189f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18a00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18a10 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
18a20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18a30 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
18a40 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
18a50 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
18a60 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
18a70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
18a80 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
18a90 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
18aa0 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
18ab0 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
18ac0 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
18ad0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
18ae0 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
18af0 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ove to..*/.stati
18b00 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
18b10 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
18b20 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
18b30 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
18b40 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
18b50 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61   MemPage *pOldPa
18b60 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
18b70 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
18b80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
18b90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
18ba0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
18bb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18bc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
18bd0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
18be0 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
18bf0 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75  , &pNewPage, pCu
18c00 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28  r->pPage);.  if(
18c10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18c20 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78  .  pNewPage->idx
18c30 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69  Parent = pCur->i
18c40 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d  dx;.  pOldPage =
18c50 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
18c60 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69  pOldPage->idxShi
18c70 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  ft = 0;.  releas
18c80 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b  ePage(pOldPage);
18c90 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
18ca0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
18cb0 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
18cc0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
18cd0 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
18ce0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
18cf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18d00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18d10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18d20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18d30 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
18d40 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76  he page is the v
18d50 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69  irtual root of i
18d60 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ts table..**.** 
18d70 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  The virtual root
18d80 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f   page is the roo
18d90 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20  t page for most 
18da0 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20  tables.  But.** 
18db0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f  for the table ro
18dc0 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20  oted on page 1, 
18dd0 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61  sometime the rea
18de0 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  l root page.** i
18df0 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66  s empty except f
18e00 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
18e10 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63  nter.  In such c
18e20 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74  ases the.** virt
18e30 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
18e40 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
18e50 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
18e60 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73   of page.** 1 is
18e70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
18e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18e90 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50  eIsRootPage(MemP
18ea0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
18eb0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
18ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
18ed0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18ee0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
18ef0 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  ) );.  pParent =
18f00 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
18f10 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d  .  if( pParent==
18f20 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
18f30 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  if( pParent->pgn
18f40 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o>1 ) return 0;.
18f50 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28 26    if( get2byte(&
18f60 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
18f70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
18f80 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  t+3])==0 ) retur
18f90 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
18fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
18fb0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
18fc0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
18fd0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
18fe0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
18ff0 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
19000 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
19010 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
19020 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
19030 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
19040 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
19050 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
19060 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
19070 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
19080 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
19090 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
190a0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
190b0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
190c0 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74  eMoveToParent(Bt
190d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
190e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
190f0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
19100 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61  age;.  int idxPa
19110 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
19120 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19130 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
19140 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19150 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19160 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
19170 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
19180 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
19190 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
191a0 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
191b0 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 50  e(pPage) );.  pP
191c0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
191d0 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
191e0 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  ( pParent!=0 );.
191f0 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50    idxParent = pP
19200 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a  age->idxParent;.
19210 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
19220 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
19230 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
19240 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75  ge(pPage);.  pCu
19250 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65  r->pPage = pPare
19260 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  nt;.  pCur->info
19270 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73  .nSize = 0;.  as
19280 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
19290 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
192a0 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
192b0 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
192c0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
192d0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
192e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
192f0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
19300 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19310 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
19320 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19330 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
19340 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
19350 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19360 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
19370 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19380 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
19390 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
193a0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
193b0 45 45 4b 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  EEK ){.    clear
193c0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
193d0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  Cur);.  }.  pRoo
193e0 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  t = pCur->pPage;
193f0 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20  .  if( pRoot && 
19400 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
19410 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  r->pgnoRoot ){. 
19420 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
19430 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65  ->isInit );.  }e
19440 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
19450 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
19460 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
19470 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
19480 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
19490 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20   0)).    ){.    
194a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
194b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
194c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
194d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
194e0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
194f0 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age);.    pCur->
19500 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20  pPage = pRoot;. 
19510 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d   }.  pCur->idx =
19520 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
19530 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
19540 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
19550 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
19560 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
19570 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72  bpage;.    asser
19580 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
19590 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65  1 );.    subpage
195a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
195b0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
195c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
195d0 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70      assert( subp
195e0 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75  age>0 );.    pCu
195f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
19600 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
19610 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
19620 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
19630 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
19640 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67  e = ((pCur->pPag
19650 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53  e->nCell>0)?CURS
19660 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f  OR_VALID:CURSOR_
19670 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75  INVALID);.  retu
19680 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19690 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
196a0 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
196b0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
196c0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
196d0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
196e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
196f0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
19700 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
19710 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
19720 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
19730 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
19740 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
19750 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
19760 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
19770 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
19780 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
19790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
197a0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
197b0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
197c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
197d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
197e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
197f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19800 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
19810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19820 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
19830 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
19840 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19850 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
19860 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
19870 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
19880 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
19890 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
198a0 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  idx));.    rc = 
198b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
198c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
198d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
198e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
198f0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
19900 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
19910 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
19920 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
19930 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
19940 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
19950 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
19960 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
19970 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
19980 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
19990 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
199a0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
199b0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
199c0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
199d0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
199e0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
199f0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
19a00 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
19a10 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
19a20 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
19a30 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
19a40 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
19a50 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
19a60 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
19a70 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
19a80 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
19a90 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
19aa0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
19ab0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
19ac0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19ad0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
19ae0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
19af0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19b00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19b10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19b20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19b30 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
19b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19b50 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
19b60 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
19b70 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
19b80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
19b90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
19ba0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
19bb0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
19bc0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
19bd0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
19be0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
19bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19c00 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64   ){.    pCur->id
19c10 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
19c20 20 2d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e   - 1;.    pCur->
19c30 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19c50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
19c60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
19c70 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
19c80 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
19c90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19ca0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
19cb0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
19cc0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
19cd0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
19ce0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
19cf0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
19d00 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
19d10 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
19d20 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
19d30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19d40 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
19d50 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19d60 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19d70 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
19d80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19d90 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
19da0 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  tree->pSqlite->m
19db0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
19dc0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
19dd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
19df0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19e00 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
19e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19e20 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
19e30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
19e40 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
19e50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19e70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
19e80 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
19e90 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
19ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
19eb0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
19ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
19ee0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
19ef0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
19f00 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
19f10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19f20 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
19f30 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
19f40 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
19f50 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
19f60 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
19f70 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
19f80 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
19f90 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
19fa0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
19fb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19fc0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
19fd0 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
19fe0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19ff0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a000 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a010 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1a020 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  tree->pSqlite->m
1a030 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1a040 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1a050 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1a060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1a070 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1a080 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1a090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a0a0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1a0b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
1a0c0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
1a0d0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1a0e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a0f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a100 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1a110 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1a120 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1a130 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1a140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1a150 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a160 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1a170 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1a180 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a  ar pKey/nKey..**
1a190 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1a1a0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1a1b0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1a1c0 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70   only the nKey p
1a1d0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1a1e0 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
1a1f0 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65  nored.  For othe
1a200 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69  r tables, nKey i
1a210 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a220 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a  bytes of data.**
1a230 20 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63   in pKey.  The c
1a240 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1a250 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77 68 65  on specified whe
1a260 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  n the cursor was
1a270 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20 75  .** created is u
1a280 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b  sed to compare k
1a290 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  eys..**.** If an
1a2a0 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
1a2b0 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
1a2c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1a2d0 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
1a2e0 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
1a2f0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
1a300 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
1a310 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
1a320 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
1a330 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
1a340 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
1a350 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
1a360 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
1a370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1a380 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
1a390 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
1a3a0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1a3b0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
1a3c0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65   written to *pRe
1a3d0 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e  s if pRes!=NULL.
1a3e0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1a3f0 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69  .** this value i
1a400 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1a410 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
1a420 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1a430 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1a440 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1a450 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1a460 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
1a470 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66   than pKey or if
1a480 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1a490 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1a4a0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1a4b0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1a4c0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1a4d0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1a4e0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1a4f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1a500 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1a510 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1a520 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1a530 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1a540 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  es pKey..**.**  
1a550 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
1a560 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1a570 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1a580 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1a5b0 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  pKey..**.*/.int 
1a5c0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1a5d0 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1a5e0 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  pCur,        /* 
1a5f0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1a600 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   moved */.  cons
1a610 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1a620 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f     /* The key co
1a630 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65  ntent for indice
1a640 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20  s.  Not used by 
1a650 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36 34 20  tables */.  i64 
1a660 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1a670 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b     /* Size of pK
1a680 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20  ey.  Or the key 
1a690 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  for tables */.  
1a6a0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
1a6b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1a6c0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
1a6d0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1a6e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1a6f0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s              /
1a700 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20  * Search result 
1a710 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  flag */.){.  int
1a720 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1a730 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a740 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1a750 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1a760 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1a770 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  ree->pSqlite->mu
1a780 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1a790 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1a7a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1a7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1a7c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a7d0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1a7e0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1a7f0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1a800 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a810 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1a820 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1a830 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a840 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1a850 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1a860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a870 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1a880 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1a890 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1a8a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1a8b0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1a8c0 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20     int c = -1;  
1a8d0 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69  /* pRes return i
1a8e0 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  f table is empty
1a8f0 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20   must be -1 */. 
1a900 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
1a910 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
1a920 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70  ll-1;.    if( !p
1a930 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1a940 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
1a950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a960 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1a970 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1a980 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1a990 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1a9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a9b0 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72  pCur->idx = (upr
1a9c0 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +lwr)/2;.    }. 
1a9d0 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20     if( lwr<=upr 
1a9e0 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20  ) for(;;){.     
1a9f0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1aa00 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1aa10 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1aa20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1aa30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1aa40 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1aa50 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1aa60 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1aa70 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1aa80 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67  Cur->idx) + pPag
1aa90 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1aaa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1aab0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1aac0 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1aad0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1aae0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1aaf0 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79  32(pCell, &dummy
1ab00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ab10 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
1ab20 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43  Cell, (u64 *)&nC
1ab30 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1ab40 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b   if( nCellKey<nK
1ab50 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1ab60 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1ab70 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1ab80 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey>nKey ){.     
1ab90 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
1aba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1abb0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
1abc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1abd0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1abe0 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20  available;.     
1abf0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76     pCellKey = (v
1ac00 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f  oid *)fetchPaylo
1ac10 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61  ad(pCur, &availa
1ac20 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
1ac30 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72   nCellKey = pCur
1ac40 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
1ac50 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62       if( availab
1ac60 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a  le>=nCellKey ){.
1ac70 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
1ac80 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75  ur->xCompare(pCu
1ac90 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65  r->pArg, nCellKe
1aca0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65  y, pCellKey, nKe
1acb0 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
1acc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1acd0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
1ace0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43  lite3_malloc( nC
1acf0 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ellKey );.      
1ad00 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
1ad10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1ad20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1ad30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ad40 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
1ad50 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f  0, nCellKey, (vo
1ad60 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  id *)pCellKey);.
1ad70 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
1ad80 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75  ur->xCompare(pCu
1ad90 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65  r->pArg, nCellKe
1ada0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65  y, pCellKey, nKe
1adb0 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
1adc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1add0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
1ade0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1ae00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1ae10 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ae20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1ae30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1ae40 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1ae50 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1ae60 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1ae70 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  lwr = pCur->idx;
1ae80 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
1ae90 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20   lwr - 1;.      
1aea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1aeb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aec0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1aed0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1aee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1aef0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
1af00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1af10 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
1af20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1af30 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1af40 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 70  .        upr = p
1af50 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20  Cur->idx-1;.    
1af60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77    }.      if( lw
1af70 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20  r>upr ){.       
1af80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1af90 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1afa0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20  = (lwr+upr)/2;. 
1afb0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1afc0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
1afd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1afe0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
1aff0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1b000 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1b010 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1b020 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
1b030 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
1b040 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
1b050 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1b060 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1b070 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
1b080 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1b090 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1b0a0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
1b0b0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
1b0c0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
1b0d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1b0e0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
1b0f0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
1b100 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
1b110 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
1b120 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1b130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b140 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1b150 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e   lwr;.    pCur->
1b160 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1b170 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1b180 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
1b190 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
1b1a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1b1b0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  c;.    }.  }.  /
1b1c0 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f  * NOT REACHED */
1b1d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
1b1e0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1b1f0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1b200 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1b210 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1b220 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1b230 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1b240 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1b250 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1b260 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1b270 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1b280 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1b290 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1b2a0 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1b2b0 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1b2c0 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1b2d0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1b2e0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1b2f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1b300 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1b310 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1b320 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1b330 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1b340 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1b350 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1b360 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1b370 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1b380 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1b390 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1b3a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1b3b0 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1b3c0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1b3d0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1b3e0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1b3f0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1b400 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1b410 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1b420 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
1b430 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a  e for a cursor..
1b440 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
1b450 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 44 62  te3BtreeCursorDb
1b460 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20  (const BtCursor 
1b470 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1b480 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b490 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1b4a0 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  e->pSqlite->mute
1b4b0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  x) );.  return p
1b4c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71  Cur->pBtree->pSq
1b4d0 6c 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  lite;.}../*.** A
1b4e0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1b4f0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1b500 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1b510 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1b520 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1b530 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1b540 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1b550 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1b560 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1b570 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1b580 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1b590 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1b5a0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1b5b0 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  Res=1..*/.static
1b5c0 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
1b5d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1b5e0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1b5f0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1b600 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1b610 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b620 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1b630 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1b640 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1b650 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1b660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1b680 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
1b690 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
1b6a0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
1b6b0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1b6c0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1b6d0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1b6e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b6f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1b700 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1b710 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1b720 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1b730 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1b740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b750 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1b760 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1b770 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1b780 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1b790 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1b7a0 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1b7b0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1b7c0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1b7d0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1b7e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
1b7f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1b800 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
1b810 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
1b820 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b830 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b840 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
1b850 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1b860 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
1b870 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1b880 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1b890 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1b8a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b8b0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
1b8c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
1b8d0 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
1b8e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
1b8f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1b900 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1b910 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1b920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b930 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1b940 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b950 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
1b960 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
1b970 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1b980 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
1b990 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->idx>=pPage->nC
1b9a0 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
1b9b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1b9c0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b  age->leafData ){
1b9d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b9e0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
1b9f0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1ba00 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1ba10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ba20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ba30 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1ba40 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
1ba50 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
1ba60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ba70 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1ba80 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1ba90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
1baa0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1bab0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bac0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1bad0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1bae0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1baf0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1bb00 3d 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  = btreeNext(pCur
1bb10 2c 20 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72  , pRes);.  retur
1bb20 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1bb30 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1bb40 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1bb50 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1bb60 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1bb70 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1bb80 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1bb90 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1bba0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1bbb0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1bbc0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1bbd0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1bbe0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1bbf0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1bc00 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1bc10 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  es=1..*/.static 
1bc20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
1bc30 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1bc40 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1bc50 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1bc60 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1bc70 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1bc80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1bc90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1bca0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1bcb0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1bcc0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1bcd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1bcf0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1bd00 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1bd10 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1bd20 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1bd30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1bd40 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1bd50 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
1bd60 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1bd70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1bd80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bd90 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1bda0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
1bdb0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
1bdc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1bdd0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1bde0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29  ( pCur->idx>=0 )
1bdf0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1be00 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1be10 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e   = get4byte( fin
1be20 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1be30 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72  r->idx) );.    r
1be40 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1be50 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
1be60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1be70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1be80 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
1be90 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1bea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
1beb0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d  hile( pCur->idx=
1bec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1bed0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1bee0 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
1bef0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1bf00 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1bf10 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1bf20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1bf30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf40 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1bf50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
1bf60 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1bf70 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1bf80 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1bf90 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1bfa0 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x--;.    pCur->i
1bfb0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1bfc0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1bfd0 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1bfe0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1bff0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1c000 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1c010 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1c020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c030 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c040 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1c050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
1c060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
1c070 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1c080 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c090 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1c0a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1c0b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1c0c0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 50 72 65  .  rc = btreePre
1c0d0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1c0e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1c100 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1c110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c120 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1c130 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1c140 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1c150 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1c160 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c170 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1c180 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1c190 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1c1a0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1c1b0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1c1c0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1c1d0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1c1e0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1c1f0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1c200 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1c210 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1c220 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1c230 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1c240 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1c250 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1c260 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1c270 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1c280 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1c290 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1c2a0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1c2b0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1c2c0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1c2d0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1c2e0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1c2f0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1c300 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1c310 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1c320 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1c330 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1c340 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1c350 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1c360 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1c370 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1c380 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1c390 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1c3a0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1c3b0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1c3c0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1c3d0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1c3e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c3f0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1c400 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1c410 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1c420 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1c430 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1c440 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1c450 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1c460 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1c470 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1c480 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1c490 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1c4a0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1c4b0 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1c4c0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1c4d0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1c4e0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1c4f0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1c500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1c510 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1c520 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1c530 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1c540 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1c550 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1c560 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1c570 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1c580 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1c590 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1c5a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1c5b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1c5c0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1c5d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c5e0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1c5f0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1c600 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1c610 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1c620 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1c630 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1c640 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c650 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1c660 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1c670 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1c680 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1c690 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1c6a0 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1c6b0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1c6c0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1c6d0 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1c6e0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1c6f0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1c700 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1c710 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1c720 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1c730 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1c740 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1c750 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1c760 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1c770 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1c780 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1c790 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1c7a0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1c7b0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1c7c0 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1c7d0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1c7e0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1c7f0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1c800 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1c810 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1c820 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1c830 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c840 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1c850 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c  t && nearby<=sql
1c860 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c870 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1c880 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1c890 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1c8a0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1c8b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1c8c0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1c8d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1c8e0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1c8f0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1c900 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c910 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1c920 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1c930 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1c940 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1c950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c960 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1c970 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1c980 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1c990 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1c9a0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1c9b0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1c9c0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1c9d0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1c9e0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1c9f0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1ca00 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1ca10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ca20 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1ca30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1ca40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1ca50 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1ca60 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1ca70 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1ca80 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1ca90 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1caa0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1cab0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1cac0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1cad0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1cae0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1caf0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1cb00 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1cb10 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1cb20 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1cb30 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1cb40 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1cb50 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1cb60 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1cb70 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1cb80 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1cb90 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1cba0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1cbb0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1cbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cbd0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1cbe0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1cbf0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1cc00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cc10 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1cc20 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1cc30 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
1cc40 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1cc50 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1cc60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1cc70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1cc80 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1cc90 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1cca0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1ccb0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1ccc0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1ccd0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1cce0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1ccf0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1cd00 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1cd10 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1cd20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1cd30 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1cd40 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1cd50 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1cd60 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1cd70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1cd80 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1cd90 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1cda0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cdb0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1cdc0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1cdd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1cde0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1cdf0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1ce00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
1ce10 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1ce20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1ce30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1ce40 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1ce50 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1ce60 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1ce70 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1ce80 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1ce90 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1cea0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1ceb0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1cec0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1ced0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1cee0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1cef0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1cf00 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1cf10 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1cf20 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1cf30 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1cf40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cf50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1cf60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cf70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
1cf80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cf90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1cfa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1cfb0 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
1cfc0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
1cfd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
1cfe0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
1cff0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
1d000 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
1d010 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
1d020 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
1d030 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1d040 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
1d050 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1d060 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1d070 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
1d080 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1d090 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1d0a0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1d0b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d0c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1d0d0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1d0e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1d0f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1d100 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1d110 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1d120 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1d130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d140 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1d150 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1d160 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1d170 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1d180 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1d190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d1a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1d1b0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1d1c0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1d1d0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d1e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d200 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1d210 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1d220 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1d230 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1d240 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1d250 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1d260 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1d270 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1d280 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1d290 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1d2a0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1d2b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d2c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1d2d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1d2e0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1d2f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1d300 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1d310 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d320 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1d330 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
1d340 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
1d350 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d370 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1d380 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1d390 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1d3a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d3b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d3c0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
1d3d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d3e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d3f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1d410 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1d420 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1d430 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1d440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d450 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1d460 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1d470 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1d480 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1d490 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
1d4a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1d4b0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1d4c0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1d4d0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
1d4e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
1d4f0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
1d500 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d510 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1d520 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1d530 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1d540 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1d550 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d560 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1d570 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1d580 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1d590 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d5a0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
1d5b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1d5c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1d5e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1d5f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1d600 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d610 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1d620 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1d630 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1d640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d650 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1d660 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1d670 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1d680 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1d690 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1d6a0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1d6b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1d6c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1d6d0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1d6e0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1d6f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1d700 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1d710 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1d720 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d730 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1d740 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1d750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d760 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1d770 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1d780 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d790 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1d7a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1d7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1d7c0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1d7d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1d7e0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1d7f0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1d800 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1d810 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1d820 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1d830 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1d840 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1d850 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1d860 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1d870 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1d880 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1d890 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1d8a0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1d8b0 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1d8c0 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1d8d0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d8f0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1d900 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1d910 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1d920 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1d930 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d940 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1d950 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1d960 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1d970 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1d980 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1d990 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1d9a0 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1d9b0 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1d9c0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1d9d0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1d9e0 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74  if( *pPgno>sqlit
1d9f0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1da00 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1da10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1da20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1da30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1da40 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1da50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1da60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1da70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1da80 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1da90 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1daa0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1dab0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1dac0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1dad0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1dae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1daf0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1db00 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1db10 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1db20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1db30 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1db40 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1db50 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1db60 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1db70 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1db80 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1db90 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1dba0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1dbb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1dbc0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1dbd0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1dbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1dbf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1dc10 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1dc20 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1dc30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1dc40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1dc50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1dc60 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1dc70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1dc80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dc90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dca0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1dcb0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1dcc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dcd0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1dce0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1dcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1dd00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1dd10 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1dd20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1dd30 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1dd40 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1dd50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1dd60 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1dd70 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1dd80 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1dd90 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1dda0 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1ddb0 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e  ile */.    *pPgn
1ddc0 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
1ddd0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1dde0 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66  Pager) + 1;..#if
1ddf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1de00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1de10 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1de20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1de30 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1de40 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1de50 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1de60 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1de70 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1de80 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1de90 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1dea0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1deb0 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1dec0 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1ded0 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1dee0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1def0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1df00 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1df10 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1df20 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1df30 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1df40 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1df50 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1df60 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1df70 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1df80 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1df90 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1dfa0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1dfb0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1dfc0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1dfd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1dfe0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1dff0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1e000 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1e010 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
1e020 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
1e030 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
1e040 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
1e050 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
1e060 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e070 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1e080 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
1e090 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
1e0a0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
1e0b0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1e0c0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1e0d0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1e0e0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1e0f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1e100 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
1e110 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
1e120 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65  *pPgno;.    }.#e
1e130 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
1e140 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1e150 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1e160 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1e170 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1e180 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1e190 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1e1a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e1b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e1c0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
1e1d0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
1e1e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e1f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e200 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
1e210 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
1e220 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e230 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
1e240 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
1e250 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
1e260 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1e270 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e280 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
1e290 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
1e2a0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
1e2b0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1e2c0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65  PrevTrunk);.  re
1e2d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e2e0 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20  * Add a page of 
1e2f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e300 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
1e310 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  t..**.** sqlite3
1e320 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1e330 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70  NOT called for p
1e340 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1e350 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
1e360 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1e370 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e380 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65  pPage->pBt;.  Me
1e390 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1e3a0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69  pBt->pPage1;.  i
1e3b0 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20  nt rc, n, k;..  
1e3c0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70  /* Prepare the p
1e3d0 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  age for freeing 
1e3e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1e3f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e400 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1e410 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1e420 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
1e430 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1e440 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1e450 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65  age(pPage->pPare
1e460 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50  nt);.  pPage->pP
1e470 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  arent = 0;..  /*
1e480 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
1e490 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
1e4a0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
1e4b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e4c0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1e4d0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1e4e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1e4f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1e500 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1e510 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
1e520 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1e530 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  n+1);..#ifdef SQ
1e540 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1e550 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
1e560 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1e570 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
1e580 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
1e590 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
1e5a0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
1e5b0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
1e5c0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
1e5d0 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ros..  */.  rc =
1e5e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e5f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1e600 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1e610 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73  eturn rc;.  mems
1e620 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1e630 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
1e640 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
1e650 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1e660 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e670 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1e680 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1e690 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1e6a0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1e6b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1e6c0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1e6d0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1e6e0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1e6f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1e700 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1e710 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1e720 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1e730 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1e740 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e750 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1e760 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1e770 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1e780 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1e790 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1e7a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e7b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1e7c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e7d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d  return rc;.    m
1e7e0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1e7f0 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70  ta, 0, 8);.    p
1e800 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e810 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1e820 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52  e->pgno);.    TR
1e830 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1e840 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50   %d first\n", pP
1e850 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
1e860 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
1e870 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c  er free pages al
1e880 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65  ready exist.  Re
1e890 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20  trive the first 
1e8a0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a  trunk page.    *
1e8b0 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  * of the freelis
1e8c0 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68  t and find out h
1e8d0 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69  ow many leaves i
1e8e0 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  t has. */.    Me
1e8f0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20  mPage *pTrunk;. 
1e900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e910 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e920 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1e930 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26  1->aData[32]), &
1e940 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1e950 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e960 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1e970 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1e980 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1e990 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1e9a0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1e9b0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1e9c0 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1e9d0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1e9e0 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1e9f0 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1ea00 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1ea10 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1ea20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ea30 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1ea40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1ea50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ea60 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1ea70 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1ea80 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1ea90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1eaa0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
1eab0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1eac0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1ead0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1eae0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
1eaf0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
1eb00 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
1eb10 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cing %d\n",.    
1eb20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
1eb30 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70  >pgno, pTrunk->p
1eb40 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1eb50 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1eb60 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1eb70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1eb80 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1eb90 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1eba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ebb0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1ebc0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1ebd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ebe0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1ebf0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1ec00 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1ec10 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
1ec20 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d  nk->aData[8+k*4]
1ec30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1ec40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
1ec50 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
1ec60 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ec70 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
1ec80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
1ec90 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
1eca0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1ecb0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1ecc0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1ecd0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1ece0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1ecf0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1ed00 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1ed10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ed20 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1ed30 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1ed40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1ed50 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1ed60 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1ed70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1ed80 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1ed90 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
1eda0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1edb0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
1edc0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
1edd0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
1ede0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
1edf0 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
1ee00 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
1ee10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ee20 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1ee30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
1ee40 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1ee50 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
1ee60 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
1ee70 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
1ee80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1ee90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1eea0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
1eeb0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
1eec0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1eed0 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
1eee0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1eef0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1ef00 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61  flow]);.  ovflPa
1ef10 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
1ef20 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
1ef30 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
1ef40 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
1ef50 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
1ef60 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
1ef70 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
1ef80 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
1ef90 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
1efa0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
1efb0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
1efc0 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  l;.    if( ovflP
1efd0 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67  gno==0 || ovflPg
1efe0 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1eff0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1f000 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1f010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f020 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f030 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76  ..    rc = getOv
1f040 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1f050 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
1f060 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26  , (nOvfl==0)?0:&
1f070 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69  ovflPgno);.    i
1f080 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f090 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  c;.    rc = free
1f0a0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
1f0b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f0c0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
1f0d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1f0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f0f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f100 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
1f110 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
1f120 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
1f130 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
1f140 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
1f150 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
1f160 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
1f170 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
1f180 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
1f190 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
1f1a0 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
1f1b0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
1f1c0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
1f1d0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
1f1e0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
1f1f0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1f200 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1f210 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
1f220 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
1f230 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
1f240 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
1f250 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
1f260 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
1f270 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
1f280 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
1f290 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
1f2a0 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
1f2b0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
1f2c0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
1f2d0 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
1f2e0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
1f2f0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1f300 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
1f310 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
1f320 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1f330 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f340 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1f350 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1f360 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
1f370 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
1f380 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1f390 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1f3a0 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
1f3b0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
1f3c0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
1f3d0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1f3e0 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
1f3f0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
1f400 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
1f410 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
1f420 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
1f430 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
1f440 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
1f450 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
1f480 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
1f490 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
1f4a0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
1f4b0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
1f4c0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
1f4d0 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
1f4e0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
1f4f0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
1f500 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
1f510 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
1f520 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1f530 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
1f540 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f550 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
1f560 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
1f570 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
1f580 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1f590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f5a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1f5b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1f5c0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
1f5d0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
1f5e0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
1f5f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1f600 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
1f610 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
1f620 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1f630 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
1f640 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1f650 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
1f660 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
1f670 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
1f680 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
1f690 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
1f6a0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
1f6b0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
1f6c0 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
1f6d0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
1f6e0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1f6f0 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
1f700 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
1f710 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
1f720 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
1f730 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
1f740 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
1f750 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
1f760 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1f770 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
1f780 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
1f790 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
1f7a0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1f7b0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
1f7c0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
1f7d0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
1f7e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1f7f0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
1f800 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
1f810 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
1f820 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
1f830 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
1f840 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
1f850 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
1f860 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
1f870 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
1f880 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
1f890 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
1f8a0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
1f8b0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
1f8c0 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
1f8d0 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
1f8e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f8f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f900 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
1f910 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
1f920 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
1f930 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
1f940 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
1f950 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1f960 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1f970 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
1f980 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
1f990 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
1f9a0 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
1f9b0 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
1f9c0 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
1f9d0 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
1f9e0 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
1f9f0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1fa00 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
1fa10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
1fa20 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
1fa30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1fa40 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1fa50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1fa60 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
1fa70 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
1fa80 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
1fa90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1faa0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fab0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
1fac0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1fad0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
1fae0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
1faf0 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
1fb00 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
1fb10 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
1fb20 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
1fb30 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
1fb40 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
1fb50 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
1fb60 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
1fb70 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
1fb80 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1fb90 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
1fba0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
1fbb0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
1fbc0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
1fbd0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
1fbe0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
1fbf0 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
1fc00 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
1fc10 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
1fc20 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
1fc30 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
1fc40 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
1fc50 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
1fc60 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
1fc70 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
1fc80 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
1fc90 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
1fca0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
1fcb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fcc0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1fcd0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
1fce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
1fcf0 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
1fd00 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
1fd10 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
1fd20 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
1fd30 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
1fd40 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
1fd50 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
1fd60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1fd70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
1fd80 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1fda0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fdb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fdc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1fdd0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
1fde0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
1fe00 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
1fe10 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
1fe20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
1fe30 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
1fe40 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
1fe50 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
1fe60 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
1fe70 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1fe80 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
1fe90 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
1fea0 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
1feb0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
1fec0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1fed0 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
1fee0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
1fef0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
1ff00 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
1ff10 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ;.    if( nSrc>0
1ff20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
1ff30 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
1ff40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ff50 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
1ff60 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
1ff70 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
1ff80 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
1ff90 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
1ffa0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
1ffb0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
1ffc0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
1ffd0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
1ffe0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
1fff0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
20000 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
20010 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
20020 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
20030 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
20040 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
20050 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
20060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20070 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
20080 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
20090 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
200a0 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
200b0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
200c0 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
200d0 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
200e0 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
200f0 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
20100 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
20110 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
20120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
20130 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
20140 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
20150 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
20160 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
20170 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
20180 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  his;.  DbPage *p
20190 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
201a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
201b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
201c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
201d0 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
201e0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
201f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20200 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
20210 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
20220 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
20230 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
20240 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
20250 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
20260 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
20270 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
20280 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
20290 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
202a0 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
202b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
202c0 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 28 73 71  This->aData==(sq
202d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
202e0 61 28 70 44 62 50 61 67 65 29 29 20 29 3b 0a 20  a(pDbPage)) );. 
202f0 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
20300 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72  pParent!=pNewPar
20310 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ent ){.        i
20320 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
20330 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  t ) sqlite3Pager
20340 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61  Unref(pThis->pPa
20350 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
20360 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70          pThis->p
20370 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72  Parent = pNewPar
20380 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ent;.        sql
20390 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e 65  ite3PagerRef(pNe
203a0 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  wParent->pDbPage
203b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
203c0 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e   pThis->idxParen
203d0 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20  t = idx;.    }. 
203e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
203f0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
20400 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
20410 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20420 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  UM.  if( pBt->au
20430 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
20440 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
20450 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  (pBt, pgno, PTRM
20460 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61  AP_BTREE, pNewPa
20470 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  rent->pgno);.  }
20480 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
20490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
204a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
204b0 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e pParent pointe
204c0 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65  r of all childre
204d0 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f  n of pPage to po
204e0 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70  int back.** to p
204f0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  Page..**.** In o
20500 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20  ther words, for 
20510 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70  every child of p
20520 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70  Page, invoke rep
20530 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74  arentPage().** t
20540 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
20550 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77   each child know
20560 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20  s that pPage is 
20570 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  its parent..**.*
20580 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
20590 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72  ets called after
205a0 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e   you memcpy() on
205b0 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61  e page into.** a
205c0 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nother..*/.stati
205d0 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68  c int reparentCh
205e0 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65  ildPages(MemPage
205f0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
20600 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  i;.  BtShared *p
20610 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
20620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20630 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20640 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20650 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
20660 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
20670 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72   pPage->leaf ) r
20680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20690 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
206a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
206b0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
206c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
206d0 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21  e, i);.    if( !
206e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
206f0 20 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65       rc = repare
20700 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
20710 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61  byte(pCell), pPa
20720 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
20730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20740 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20750 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
20760 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20770 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61   rc = reparentPa
20780 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
20790 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
207a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
207b0 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 70 50 61  8]), .       pPa
207c0 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 50 61 67  ge, i);.    pPag
207d0 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
207e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
207f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
20800 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
20810 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
20820 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
20830 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
20840 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
20850 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
20860 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
20870 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
20880 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
20890 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
208a0 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
208b0 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
208c0 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
208d0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
208e0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
208f0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
20900 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
20910 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
20920 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
20930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
20940 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
20950 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
20960 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69  int sz){.  int i
20970 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
20980 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20990 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
209a0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
209b0 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
209c0 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
209d0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
209e0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
209f0 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
20a00 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
20a10 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
20a20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
20a30 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
20a40 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
20a50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
20a60 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
20a70 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
20a80 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
20a90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
20aa0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
20ab0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
20ac0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20ad0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
20ae0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
20af0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
20b00 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
20b10 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
20b20 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
20b30 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
20b40 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
20b50 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
20b60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
20b70 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
20b80 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
20b90 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
20ba0 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
20bb0 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
20bc0 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
20bd0 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
20be0 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
20bf0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
20c00 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
20c10 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
20c20 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
20c30 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
20c40 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
20c50 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
20c60 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
20c70 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
20c80 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
20c90 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
20ca0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
20cb0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
20cc0 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
20cd0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
20ce0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
20cf0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
20d00 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
20d10 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
20d20 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
20d30 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
20d40 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
20d50 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
20d60 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
20d70 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
20d80 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
20d90 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
20da0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
20db0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
20dc0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
20dd0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
20de0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
20df0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
20e00 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
20e10 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
20e20 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
20e30 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
20e40 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
20e50 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
20e60 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
20e70 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
20e80 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
20e90 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
20ea0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
20eb0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
20ec0 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
20ed0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
20ee0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
20ef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20f00 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
20f10 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
20f20 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
20f30 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
20f40 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
20f50 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
20f60 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
20f70 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
20f80 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
20f90 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
20fa0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
20fb0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
20fc0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
20fd0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
20fe0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
20ff0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
21000 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
21010 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
21020 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
21030 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
21040 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
21050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
21060 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
21070 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
21080 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
21090 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
210a0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
210b0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
210c0 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
210d0 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
210e0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
210f0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
21100 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
21110 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
21120 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
21130 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
21140 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
21150 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
21160 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21170 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
21180 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21190 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
211a0 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
211b0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
211c0 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
211d0 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
211e0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
211f0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
21200 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
21210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21220 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
21230 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
21240 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
21250 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
21260 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
21270 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
21280 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
21290 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
212a0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
212b0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
212c0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
212d0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
212e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
212f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
21300 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
21310 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
21320 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
21330 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
21340 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
21350 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
21360 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
21370 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
21380 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
21390 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
213a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
213b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
213c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
213d0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
213e0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
213f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
21400 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
21410 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
21420 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
21430 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
21440 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
21450 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
21460 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
21470 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
21480 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
21490 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73  .    assert( j<s
214a0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
214b0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
214c0 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20  ->aOvfl[0]) );. 
214d0 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
214e0 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
214f0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
21500 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20  fl[j].idx = i;. 
21510 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
21520 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21530 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
21540 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
21550 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
21560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
21580 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21590 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
215a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
215b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
215c0 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
215d0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
215e0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
215f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
21600 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
21610 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
21620 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
21630 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
21640 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
21650 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
21660 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
21670 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
21680 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
21690 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
216a0 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72  .      rc = defr
216b0 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
216c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
216d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
216e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f  urn rc;.      to
216f0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
21700 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
21710 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20    assert( end + 
21720 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20  sz <= top );.   
21730 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c   }.    idx = all
21740 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
21750 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72  , sz);.    asser
21760 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20  t( idx>0 );.    
21770 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67  assert( end <= g
21780 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
21790 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  r+5]) );.    pPa
217a0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
217b0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
217c0 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   2;.    memcpy(&
217d0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
217e0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
217f0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72  -nSkip);.    for
21800 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
21810 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
21820 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
21830 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
21840 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
21850 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
21860 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
21870 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
21880 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
21890 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
218a0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
218b0 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
218c0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
218d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
218e0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
218f0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
21900 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
21910 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
21920 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
21930 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
21940 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
21950 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
21960 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
21970 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
21980 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
21990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
219a0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
219b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
219c0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
219d0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
219e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
219f0 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
21a00 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
21a10 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
21a20 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
21a30 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
21a40 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
21a50 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
21a60 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
21a70 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
21a80 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
21a90 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
21aa0 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
21ab0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
21ac0 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f  Page->pBt, pgnoO
21ad0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
21ae0 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
21af0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
21b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21b20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
21b30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
21b40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21b50 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
21b60 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
21b70 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
21b80 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
21b90 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
21ba0 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
21bb0 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
21bc0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
21bd0 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
21be0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
21bf0 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
21c00 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
21c10 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
21c20 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
21c30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
21c40 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
21c50 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
21c60 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
21c70 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
21c80 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e  l bodies */.  in
21c90 74 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  t *aSize        
21ca0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
21cb0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
21cc0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
21cd0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21ce0 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69  */.  int totalSi
21cf0 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  ze;    /* Total 
21d00 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
21d10 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  s */.  int hdr; 
21d20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21d30 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  x of page header
21d40 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74   */.  int cellpt
21d50 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  r;      /* Addre
21d60 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
21d70 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
21d80 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
21d90 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
21da0 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
21db0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
21dc0 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
21dd0 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  he page */..  as
21de0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
21df0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
21e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21e10 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
21e20 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
21e30 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b    totalSize = 0;
21e40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
21e50 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74  ell; i++){.    t
21e60 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a  otalSize += aSiz
21e70 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  e[i];.  }.  asse
21e80 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a  rt( totalSize+2*
21e90 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46  nCell<=pPage->nF
21ea0 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ree );.  assert(
21eb0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
21ec0 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20   );.  cellptr = 
21ed0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
21ee0 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
21ef0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
21f00 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
21f10 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  et;.  put2byte(&
21f20 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
21f30 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ll);.  if( nCell
21f40 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   ){.    cellbody
21f50 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
21f60 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a  (pPage, totalSiz
21f70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
21f80 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20  cellbody>0 );.  
21f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
21fa0 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c  >nFree >= 2*nCel
21fb0 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l );.    pPage->
21fc0 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c  nFree -= 2*nCell
21fd0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
21fe0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
21ff0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
22000 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c  ta[cellptr], cel
22010 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65  lbody);.      me
22020 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
22030 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
22040 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20   aSize[i]);.    
22050 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a    cellptr += 2;.
22060 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b        cellbody +
22070 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
22080 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  }.    assert( ce
22090 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70  llbody==pPage->p
220a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
220b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
220c0 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a  Cell = nCell;.}.
220d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
220e0 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
220f0 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
22100 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
22110 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
22120 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
22130 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
22140 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
22150 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
22160 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
22170 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
22180 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
22190 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
221a0 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
221b0 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
221c0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
221d0 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
221e0 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
221f0 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
22200 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
22210 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
22220 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
22230 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
22240 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
22250 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
22260 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
22270 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
22280 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
22290 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
222a0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
222b0 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
222c0 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
222d0 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
222e0 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
222f0 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
22300 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
22310 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
22320 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
22330 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
22340 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
22350 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
22360 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
22370 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
22380 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
22390 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
223a0 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
223b0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
223c0 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
223d0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
223e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
223f0 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a  MemPage*, int);.
22400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22410 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
22420 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
22430 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
22440 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
22450 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
22460 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
22470 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
22480 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
22490 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
224a0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
224b0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
224c0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
224d0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
224e0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
224f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
22500 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
22510 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
22520 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
22530 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
22540 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
22550 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
22560 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
22570 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
22580 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
22590 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
225a0 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
225b0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
225c0 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
225d0 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
225e0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
225f0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
22600 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
22610 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
22620 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
22630 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
22640 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
22650 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
22660 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
22670 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
22680 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
22690 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
226a0 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
226b0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
226c0 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
226d0 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
226e0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
226f0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
22700 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
22710 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
22720 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
22730 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
22740 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
22750 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
22760 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
22770 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
22780 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
22790 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
227a0 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  int szCell;.  Ce
227b0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42  llInfo info;.  B
227c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
227d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
227e0 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
227f0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
22800 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
22810 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
22820 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
22830 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
22840 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22850 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
22860 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
22870 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
22880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
22890 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
228a0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
228b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
228c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
228d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
228e0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
228f0 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
22900 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
22910 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
22920 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
22930 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
22940 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
22950 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
22960 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
22970 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
22980 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
22990 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
229a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
229b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
229c0 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
229d0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
229e0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  .  szCell = cell
229f0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
22a00 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67  Cell);.  zeroPag
22a10 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
22a20 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65  Data[0]);.  asse
22a30 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
22a40 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
22a50 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  l);.  pPage->nOv
22a60 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f  erflow = 0;..  /
22a70 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74  * Set the parent
22a80 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c   of the newly al
22a90 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20  located page to 
22aa0 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e  pParent. */.  pN
22ab0 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
22ac0 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
22ad0 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
22ae0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
22af0 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65  * pPage is curre
22b00 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63  ntly the right-c
22b10 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e  hild of pParent.
22b20 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a   Change this.  *
22b30 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69  * so that the ri
22b40 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65  ght-child is the
22b50 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61   new page alloca
22b60 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20  ted above and.  
22b70 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
22b80 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
22b90 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ild. .  */.  ass
22ba0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
22bb0 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d  l>0 );.  pCell =
22bc0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
22bd0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
22be0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22bf0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
22c00 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
22c10 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  );.  rc = fillIn
22c20 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61  Cell(pParent, pa
22c30 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  rentCell, 0, inf
22c40 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
22c50 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20   &parentSize);. 
22c60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22c70 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
22c80 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
22c90 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
22ca0 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72   );.  rc = inser
22cb0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
22cc0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
22cd0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
22ce0 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72  , 0, 4);.  if( r
22cf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22d00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22d10 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66 69   }.  put4byte(fi
22d20 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
22d30 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
22d40 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
22d50 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
22d60 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
22d70 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
22d80 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69  ], pgnoNew);..#i
22d90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22da0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
22db0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
22dc0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
22dd0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
22de0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
22df0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
22e00 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
22e10 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
22e20 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
22e30 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
22e40 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
22e50 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
22e60 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22e70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
22e80 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
22e90 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
22ea0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
22eb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
22ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ed0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
22ee0 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
22ef0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
22f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22f10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22f20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
22f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22f40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
22f50 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
22f60 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
22f70 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65  page and balance
22f80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
22f90 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  ,.  ** in case t
22fa0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
22fb0 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
22fc0 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
22fd0 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  rfull..  */.  re
22fe0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
22ff0 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63  .  return balanc
23000 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d  e(pParent, 0);.}
23010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23020 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
23030 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
23040 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
23050 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
23060 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
23070 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
23080 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
23090 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
230a0 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
230b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
230c0 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
230d0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
230e0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
230f0 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
23100 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
23110 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
23120 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
23130 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
23140 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
23150 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
23160 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
23170 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
23180 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
23190 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
231a0 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
231b0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
231c0 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
231d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
231e0 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
231f0 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
23200 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
23210 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
23220 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
23230 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
23240 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
23250 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
23260 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
23270 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
23280 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
23290 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
232a0 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
232b0 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
232c0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
232d0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
232e0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
232f0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
23300 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
23310 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
23320 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
23330 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
23340 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
23350 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
23360 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
23370 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
23380 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
23390 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
233a0 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
233b0 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
233c0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
233d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
233e0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
233f0 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
23400 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
23410 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
23420 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
23430 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
23440 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
23450 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
23460 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
23470 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23480 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
23490 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
234a0 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
234b0 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
234c0 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
234d0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
234e0 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
234f0 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
23500 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
23510 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
23520 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
23530 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
23540 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
23550 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
23560 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
23570 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
23580 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
23590 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
235a0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
235b0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
235c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
235d0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
235e0 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
235f0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
23600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
23610 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
23620 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
23630 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
23640 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  nroot(MemPage *p
23650 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
23660 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
23670 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
23680 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ent of pPage */.
23690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
236b0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
236c0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
236d0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
236e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
236f0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
23700 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
23710 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
23720 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
23730 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
23740 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
23750 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  om. */.  int nOl
23760 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
23770 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23780 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
23790 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
237a0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
237b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
237c0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
237d0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
237e0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
237f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23800 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
23810 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
23820 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
23830 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23840 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
23850 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
23860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23870 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
23880 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
23890 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
238c0 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
238d0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
238e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
238f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23900 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
23910 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
23920 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
23930 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
23940 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
23950 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
23960 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
23970 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
23980 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
23990 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
239a0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
239b0 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
239c0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
239d0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
239e0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
239f0 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
23a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
23a10 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
23a20 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
23a30 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
23a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
23a50 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
23a60 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
23a70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
23a80 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
23a90 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
23aa0 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
23ab0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pace[] */.  MemP
23ac0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
23ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
23ae0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
23af0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
23b00 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
23b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23b20 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
23b30 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
23b40 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
23b50 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
23b60 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
23b70 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
23b80 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
23b90 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
23ba0 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
23bb0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
23bc0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
23bd0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
23be0 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
23bf0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
23c00 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
23c10 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
23c20 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
23c30 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
23c40 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
23c50 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
23c60 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
23c70 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
23c80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
23c90 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
23ca0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
23cb0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
23cc0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
23cd0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
23ce0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
23cf0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
23d00 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
23d10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23d20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
23d30 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
23d40 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20  .  int *szCell; 
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
23d70 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
23d80 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
23d90 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
23da0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
23db0 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
23dc0 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
23dd0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b 20  /.  u8 *aSpace; 
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
23e00 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  d copies of divi
23e10 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69  ders cells */.#i
23e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23e30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75  T_AUTOVACUUM.  u
23e40 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  8 *aFrom = 0;.#e
23e50 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
23e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
23e70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
23e80 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a  utex) );..  /* .
23e90 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
23ea0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
23eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23ec0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
23ed0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
23ee0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
23ef0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
23f00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
23f10 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
23f20 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
23f30 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
23f40 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
23f50 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
23f60 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
23f70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23f80 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
23f90 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
23fa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23fb0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
23fc0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
23fd0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
23fe0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
23ff0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
24000 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24010 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
24020 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
24030 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
24040 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
24050 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
24060 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
24070 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
24080 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
24090 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
240a0 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
240b0 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
240c0 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
240d0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
240e0 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
240f0 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
24100 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
24110 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
24120 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
24130 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
24140 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
24150 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
24160 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
24170 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
24180 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
24190 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
241a0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
241b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
241c0 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
241d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
241e0 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66       pPage->leaf
241f0 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50  Data &&.      pP
24200 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
24210 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
24220 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
24230 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
24240 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
24250 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
24260 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
24270 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
24280 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24290 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
242a0 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a  gno.  ){.    /*.
242b0 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65      ** TODO: Che
242c0 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ck the siblings 
242d0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70  to the left of p
242e0 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Page. It may be 
242f0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79  that.    ** they
24300 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e   are not full an
24310 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73  d no new page is
24320 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
24330 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c  /.    return bal
24340 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65  ance_quick(pPage
24350 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
24360 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51  #endif..  if( SQ
24370 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
24380 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24390 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
243a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
243b0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  rc;.  }..  /*.  
243c0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
243d0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
243e0 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
243f0 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
24400 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
24410 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
24420 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
24430 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
24440 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
24450 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
24460 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
24470 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
24480 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
24490 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
244a0 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a  nt->idxShift ){.
244b0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
244c0 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d     pgno = pPage-
244d0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
244e0 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  t( pgno==sqlite3
244f0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
24500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
24510 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30  );.    for(idx=0
24520 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ; idx<pParent->n
24530 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  Cell; idx++){.  
24540 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
24550 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
24560 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29  t, idx))==pgno )
24570 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
24580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24590 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
245a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20  Parent->nCell.  
245b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65             || ge
245c0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
245d0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
245e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
245f0 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno );.  }else{.
24600 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d      idx = pPage-
24610 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  >idxParent;.  }.
24620 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69  .  /*.  ** Initi
24630 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  alize variables 
24640 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
24650 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a  be safe to jump.
24660 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
24670 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
24680 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a   at any moment..
24690 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e    */.  nOld = nN
246a0 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
246b0 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
246c0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
246d0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
246e0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
246f0 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
24700 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
24710 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
24720 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
24730 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
24740 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
24750 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
24760 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
24770 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
24780 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
24790 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
247a0 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
247b0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
247c0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
247d0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
247e0 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
247f0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
24800 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
24810 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
24820 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
24830 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
24840 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
24850 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
24860 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
24870 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
24880 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
24890 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
248a0 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
248b0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
248c0 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
248d0 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
248e0 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
248f0 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
24900 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24910 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
24920 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
24930 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
24940 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
24950 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
24960 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
24970 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
24980 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
24990 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
249a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
249b0 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
249c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
249d0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
249e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
249f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24a00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24a10 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
24a20 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
24a30 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
24a40 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
24a50 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
24a60 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
24a70 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
24a80 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
24a90 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
24aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
24ab0 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
24ac0 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
24ad0 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
24ae0 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
24af0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
24b00 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
24b10 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
24b20 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 2 in order to
24b30 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
24b40 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
24b50 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
24b60 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29   (nMaxCells + 1)
24b70 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~1;..  /*.  ** 
24b80 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
24b90 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
24ba0 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65  ures.  */.  apCe
24bb0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ll = sqlite3_mal
24bc0 6c 6f 63 28 20 0a 20 20 20 20 20 20 20 6e 4d 61  loc( .       nMa
24bd0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
24be0 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c00 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
24c10 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
24c20 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20 20  f(int)          
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
24c50 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65     + ROUND8(size
24c60 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20  of(MemPage))*NB 
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f       /* aCopy */
24c90 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
24ca0 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20  eSize*(5+NB)    
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cc0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
24cd0 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  e */.     + (ISA
24ce0 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
24cf0 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20  Cells : 0)      
24d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
24d10 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  From */.  );.  i
24d20 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
24d30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24d40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
24d50 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
24d60 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
24d70 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (int*)&apCell[nM
24d80 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
24d90 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
24da0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
24db0 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
24dc0 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[0] - (u8*)apCe
24dd0 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
24de0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
24df0 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
24e00 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
24e10 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
24e20 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
24e30 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
24e40 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
24e50 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
24e60 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
24e70 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
24e80 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
24e90 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
24ea0 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
24eb0 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b  aSpace = &aCopy[
24ec0 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
24ed0 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
24ee0 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
24ef0 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
24f00 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
24f10 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
24f20 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
24f30 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64  equired */.#ifnd
24f40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
24f50 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
24f60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
24f70 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
24f80 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61  aSpace[5*pBt->pa
24f90 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e  geSize];.  }.#en
24fa0 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  dif.  .  /*.  **
24fb0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
24fc0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
24fd0 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  Page and its sib
24fe0 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b  lings into aOld[
24ff0 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74  ]..  ** The rest
25000 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
25010 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
25020 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
25030 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74  rather.  ** that
25040 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
25050 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
25060 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
25070 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  l be in the.  **
25080 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
25090 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20  g overwritten.. 
250a0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
250b0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
250c0 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70   MemPage *p = ap
250d0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
250e0 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42  ge*)&aCopy[i][pB
250f0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
25100 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
25110 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
25120 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63  eSize];.    memc
25130 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f  py(p->aData, apO
25140 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
25150 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69  t->pageSize + si
25160 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
25170 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70      /* The memcp
25180 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65  y() above change
25190 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  s the value of p
251a0 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68 61  ->aData so we ha
251b0 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74  ve to.    ** set
251c0 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20   it again. */.  
251d0 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
251e0 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
251f0 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize];.  }..  /
25200 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
25210 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
25220 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
25230 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
25240 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
25250 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
25260 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
25270 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
25280 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
25290 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
252a0 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
252b0 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ace[] and remove
252c0 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
252d0 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
252e0 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
252f0 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
25300 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
25310 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
25320 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
25330 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
25340 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
25350 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
25360 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
25370 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
25380 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20   into aSpace[]. 
25390 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
253a0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
253b0 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
253c0 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
253d0 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
253e0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
253f0 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
25400 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
25410 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
25420 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
25430 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
25440 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
25450 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
25460 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
25470 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
25480 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
25490 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
254a0 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
254b0 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
254c0 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
254d0 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
254e0 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
254f0 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
25500 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
25510 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
25520 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
25530 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
25540 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e  fData && pPage->
25550 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  leaf;.  for(i=0;
25560 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
25570 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
25580 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
25590 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
255a0 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
255b0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
255c0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
255d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
255e0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
255f0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
25600 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
25610 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
25620 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
25630 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
25640 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
25650 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
25660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25670 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25680 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
25690 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
256a0 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
256b0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
256c0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
256d0 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
256e0 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
256f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
25700 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
25710 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
25720 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
25730 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
25740 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
25750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
25760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25770 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25780 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
25790 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
257a0 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  d-1 ){.      int
257b0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
257c0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
257d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
257e0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
257f0 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20      /* With the 
25800 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70  LEAFDATA flag, p
25810 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c  Parent cells hol
25820 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74  d only INTKEYs t
25830 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
25840 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
25850 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69   keys on the chi
25860 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65  ld pages.  We ne
25870 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20  ed to remove.   
25880 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69       ** the divi
25890 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  der cells from p
258a0 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20  Parent, but the 
258b0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
258c0 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  re not.        *
258d0 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c  * added to apCel
258e0 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79  l[] because they
258f0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
25900 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a  of child cells..
25910 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25920 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
25930 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
25940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25950 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
25960 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25970 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
25980 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65   );.        szCe
25990 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
259a0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
259b0 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
259c0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
259d0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
259e0 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
259f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
25a00 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
25a10 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
25a20 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
25a30 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
25a40 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
25a50 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ion;.#ifndef SQL
25a60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25a70 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
25a80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
25aa0 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
25ab0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
25ac0 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  if.        dropC
25ad0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
25ae0 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  iv, sz);.       
25af0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
25b00 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  = leafCorrection
25b10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25b20 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70  ( get4byte(pTemp
25b30 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b  )==pgnoOld[i] );
25b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f  .        if( !pO
25b50 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
25b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
25b70 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
25b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
25b90 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
25ba0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
25bb0 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
25bc0 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
25bd0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
25be0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
25bf0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
25c00 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
25c10 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
25c20 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  ta[pOld->hdrOffs
25c30 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  et+8], 4);.     
25c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25c50 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
25c60 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
25c70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
25c80 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
25c90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
25ca0 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e   Do not allow an
25cb0 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20  y cells smaller 
25cc0 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f  than 4 bytes. */
25cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43  .            szC
25ce0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a  ell[nCell] = 4;.
25cf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25d00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43      }.        nC
25d10 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
25d20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
25d30 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
25d40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
25d50 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
25d60 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
25d70 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
25d80 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
25d90 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
25da0 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
25db0 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
25dc0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
25dd0 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
25de0 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
25df0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
25e00 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
25e10 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
25e20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
25e30 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
25e40 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
25e50 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
25e60 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
25e70 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
25e80 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
25e90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
25ea0 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
25eb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
25ec0 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
25ed0 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
25ee0 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
25ef0 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
25f00 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
25f10 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
25f20 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
25f30 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
25f40 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
25f50 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
25f60 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
25f70 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
25f80 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
25f90 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
25fa0 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
25fb0 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
25fc0 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
25fd0 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
25fe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
25ff0 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
26000 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
26010 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
26020 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
26030 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
26040 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
26050 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
26060 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
26070 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
26080 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
26090 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
260a0 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
260b0 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
260c0 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
260d0 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
260e0 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
260f0 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
26100 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
26110 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
26120 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
26130 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
26140 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
26150 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
26160 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
26170 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
26180 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
26190 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
261a0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
261b0 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
261c0 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
261d0 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
261e0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
261f0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
26200 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
26210 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
26220 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
26230 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
26240 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
26250 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
26260 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
26270 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
26280 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
26290 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
262a0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
262b0 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
262c0 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
262d0 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
262e0 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
262f0 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
26300 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
26310 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
26320 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
26330 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
26340 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
26350 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
26360 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
26370 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
26380 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
26390 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
263a0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
263b0 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
263c0 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
263d0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
263e0 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
263f0 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
26400 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
26410 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
26420 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
26430 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
26440 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26450 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
26460 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
26470 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
26480 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
26490 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
264a0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
264b0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
264c0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
264d0 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
264e0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
264f0 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
26500 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
26510 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
26520 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
26530 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
26540 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
26550 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
26560 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
26570 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
26580 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
26590 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
265a0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
265b0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
265c0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
265d0 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
265e0 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
265f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
26600 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
26610 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
26620 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77  tnew[0])>0) or w
26630 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61  e are the.  ** a
26640 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
26650 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
26660 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
26670 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
26680 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
26690 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
266a0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
266b0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
266c0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
266d0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
266e0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
266f0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
26700 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41   );..  /*.  ** A
26710 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
26720 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
26730 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
26740 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ible..  */.  ass
26750 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
26760 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67  >1 );.  pageFlag
26770 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  s = pPage->aData
26780 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
26790 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
267a0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
267b0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
267c0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
267d0 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
267e0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
267f0 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b  i] = pgnoOld[i];
26800 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
26810 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
26820 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26830 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
26840 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
26850 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
26860 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26870 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nup;.    }else{.
26880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
26890 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
268a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
268b0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
268c0 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e  gnoNew[i], pgnoN
268d0 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20  ew[i-1], 0);.   
268e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
268f0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
26900 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
26910 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
26920 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  New++;.    }.   
26930 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
26940 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pageFlags);.  }.
26950 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
26960 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
26970 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
26980 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
26990 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
269a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
269b0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
269c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
269d0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
269e0 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
269f0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
26a00 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
26a10 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
26a20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
26a30 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
26a40 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
26a50 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
26a60 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
26a70 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
26a80 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
26a90 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
26aa0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
26ab0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
26ac0 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
26ad0 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
26ae0 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
26af0 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
26b00 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
26b10 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
26b20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
26b30 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
26b40 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
26b50 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
26b60 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
26b70 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
26b80 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
26b90 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
26ba0 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
26bb0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
26bc0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
26bd0 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
26be0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
26bf0 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
26c00 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
26c10 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
26c20 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
26c30 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
26c40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
26c50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
26c60 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
26c70 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
26c80 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
26c90 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
26ca0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
26cb0 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
26cc0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
26cd0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
26ce0 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
26cf0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
26d00 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
26d10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
26d20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
26d30 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
26d40 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
26d50 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
26d60 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
26d70 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
26d80 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
26d90 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
26da0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
26db0 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
26dc0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
26dd0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
26de0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
26df0 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
26e00 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
26e10 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
26e20 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
26e30 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
26e40 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
26e50 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
26e60 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
26e70 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
26e80 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
26e90 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
26ea0 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
26eb0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
26ec0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
26ed0 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
26ee0 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
26ef0 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
26f00 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
26f10 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
26f20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
26f30 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
26f40 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
26f50 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
26f60 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
26f70 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
26f80 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
26f90 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
26fa0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
26fb0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
26fc0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
26fd0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
26fe0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
26ff0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
27000 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
27010 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
27020 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
27030 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
27040 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
27050 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
27060 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27070 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27080 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
27090 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65   );.    assemble
270a0 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
270b0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
270c0 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
270d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
270e0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
270f0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
27100 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
27110 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
27120 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69  erflow==0 );..#i
27130 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27140 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
27150 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
27160 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
27170 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
27180 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
27190 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
271a0 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
271b0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
271c0 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
271d0 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
271e0 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
271f0 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
27200 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
27210 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
27220 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
27230 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
27240 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
27250 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
27260 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66  acuum ){.      f
27270 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
27280 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
27290 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
272a0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
272b0 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
272c0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
272d0 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
272e0 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
272f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
27300 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
27310 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
27320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27340 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
27350 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
27360 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
27380 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  if..    j = cntN
27390 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
273a0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
273b0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
273c0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
273d0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
273e0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
273f0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
27400 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
27410 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
27420 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
27430 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
27440 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
27450 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
27460 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
27470 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
27480 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27490 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
274a0 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
274b0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
274c0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
274d0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
274e0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
274f0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
27500 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
27510 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
27520 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27530 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
27540 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
27550 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
27560 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
27570 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
27580 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
27590 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
275a0 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
275b0 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
275c0 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
275d0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
275e0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
275f0 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
27600 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
27610 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
27620 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
27630 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
27640 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
27650 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27660 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
27670 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
27680 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
27690 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
276a0 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
276b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
276c0 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53  ell = &aSpace[iS
276d0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66  pace];.        f
276e0 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
276f0 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  t, pCell, 0, inf
27700 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
27710 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69   &sz);.        i
27720 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
27730 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
27740 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
27750 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
27760 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
27770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27780 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
27790 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
277a0 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
277b0 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
277c0 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
277d0 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
277e0 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
277f0 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
27800 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
27810 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
27820 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
27830 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
27840 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
27850 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
27860 6f 64 65 2c 20 61 6e 64 20 69 74 27 73 20 72 65  ode, and it's re
27870 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
27880 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
27890 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
278a0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
278b0 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
278c0 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73         ** (see s
278d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
278e0 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
278f0 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
27900 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
27910 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
27920 42 75 74 20 69 74 27 73 20 69 6d 70 6f 72 74 61  But it's importa
27930 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
27940 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
27950 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
27960 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
27970 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
27980 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
27990 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
279a0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
279b0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
279c0 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
279d0 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
279e0 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
279f0 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
27a00 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
27a10 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
27a20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
27a30 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
27a40 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
27a50 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
27a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
27a70 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
27a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
27a90 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
27aa0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
27ab0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
27ac0 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
27ad0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
27ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
27af0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
27b00 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
27b10 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
27b20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
27b30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27b40 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
27b50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
27b60 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
27b70 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
27b80 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23  , pNew->pgno);.#
27b90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27ba0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
27bb0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
27bc0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
27bd0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
27be0 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
27bf0 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
27c00 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
27c10 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
27c20 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
27c30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
27c40 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
27c50 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
27c60 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
27c70 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
27c80 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
27c90 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65  utoVacuum && !le
27ca0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
27cb0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
27cc0 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
27cd0 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
27ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
27d00 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
27d10 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
27d20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27d30 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
27d40 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
27d50 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
27d60 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27d70 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
27d80 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
27d90 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
27da0 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
27db0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
27dc0 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
27dd0 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f  a[8], &apCopy[nO
27de0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ld-1]->aData[8],
27df0 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   4);.  }.  if( n
27e00 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
27e10 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
27e20 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
27e30 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
27e40 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
27e50 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
27e60 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
27e70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
27e80 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
27e90 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
27ea0 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
27eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
27ec0 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
27ed0 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
27ee0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
27ef0 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
27f00 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
27f10 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
27f20 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
27f30 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
27f40 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
27f50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
27f60 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
27f70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27f80 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65  Reparent childre
27f90 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a  n of all cells..
27fa0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
27fb0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
27fc0 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
27fd0 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b  hildPages(apNew[
27fe0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
27ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
28000 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28010 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65  p;.  }.  rc = re
28020 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
28030 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  (pParent);.  if(
28040 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28050 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28060 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  eanup;..  /*.  *
28070 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
28080 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
28090 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
280a0 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
280b0 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
280c0 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
280d0 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
280e0 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
280f0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
28100 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
28110 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
28120 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
28130 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
28140 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
28150 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62 61  nit );.  rc = ba
28160 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
28170 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
28180 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
28190 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
281a0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
281b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
281c0 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
281d0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
281e0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
281f0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
28200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
28210 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
28220 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
28230 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
28240 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
28250 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
28260 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  E: finished with
28270 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d   %d: old=%d new=
28280 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
28290 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
282a0 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65  >pgno, nOld, nNe
282b0 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65  w, nCell));.  re
282c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
282d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
282e0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
282f0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
28300 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72  btree when the r
28310 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  oot.** page cont
28320 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20  ains no cells.  
28330 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72  This is an oppor
28340 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74  tunity to make t
28350 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c  he tree.** shall
28360 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65  ower by one leve
28370 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
28380 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
28390 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
283a0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
283b0 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
283c0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
283d0 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
283e0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
283f0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
28400 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
28410 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
28420 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
28430 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
28440 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28450 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
28460 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
28470 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
28480 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
28490 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
284a0 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
284b0 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
284c0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
284d0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
284e0 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
284f0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
28500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28510 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
28520 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
28530 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43  ed */.  int *szC
28540 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
28550 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
28560 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
28570 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
28580 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
28590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
285a0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
285b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
285c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
285d0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
285e0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
285f0 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50  ->pBt;.  mxCellP
28600 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c  erPage = MX_CELL
28610 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20  (pBt);.  apCell 
28620 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
28630 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a  ( mxCellPerPage*
28640 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a  (sizeof(u8*)+siz
28650 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69  eof(int)) );.  i
28660 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72  f( apCell==0 ) r
28670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28680 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28  EM;.  szCell = (
28690 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43  int*)&apCell[mxC
286a0 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69  ellPerPage];.  i
286b0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
286c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  {.    /* The tab
286d0 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  le is completely
286e0 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52   empty */.    TR
286f0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65  ACE(("BALANCE: e
28700 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22  mpty table %d\n"
28710 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
28720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
28730 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
28740 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20  s empty but has 
28750 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e  one child.  Tran
28760 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  sfer the.    ** 
28770 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
28780 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20   that one child 
28790 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  into the root pa
287a0 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a  ge if it .    **
287b0 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73   will fit.  This
287c0 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70   reduces the dep
287d0 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62  th of the tree b
287e0 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  y one..    **.  
287f0 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
28800 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c   page is page 1,
28810 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61   it has less spa
28820 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61  ce available tha
28830 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69  n.    ** its chi
28840 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31  ld (due to the 1
28850 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74  00 byte header t
28860 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
28870 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  e beginning.    
28880 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
28890 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d  se fle), so it m
288a0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65  ight not be able
288b0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20   to hold all of 
288c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f  the .    ** info
288d0 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  rmation currentl
288e0 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  y contained in t
288f0 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68  he child.  If th
28900 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a  is is the .    *
28910 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20  * case, then do 
28920 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73  not do the trans
28930 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65  fer.  Leave page
28940 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a   1 empty except.
28950 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72      ** for the r
28960 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20  ight-pointer to 
28970 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  the child page. 
28980 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   The child page 
28990 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74  becomes.    ** t
289a0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
289b0 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20  of the tree..   
289c0 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   */.    pgnoChil
289d0 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
289e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
289f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
28a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
28a10 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20  oChild>0 );.    
28a20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
28a30 64 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  d<=sqlite3PagerP
28a40 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  agecount(pPage->
28a50 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a  pBt->pPager) );.
28a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28a70 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61  BtreeGetPage(pPa
28a80 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69  ge->pBt, pgnoChi
28a90 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b  ld, &pChild, 0);
28aa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28ab0 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
28ac0 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20  alance;.    if( 
28ad0 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pPage->pgno==1 )
28ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28af0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
28b00 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
28b10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
28b20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
28b30 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
28b40 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
28b50 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
28b60 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
28b70 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b  d->nFree>=100 ){
28b80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28b90 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
28ba0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  n will fit on th
28bb0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20  e root page, so 
28bc0 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  do the.        *
28bd0 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  * copy */.      
28be0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
28bf0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
28c00 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
28c10 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
28c20 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
28c30 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
28c40 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20        apCell[i] 
28c50 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c  = findCell(pChil
28c60 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d,i);.          
28c70 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c  szCell[i] = cell
28c80 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20  SizePtr(pChild, 
28c90 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
28ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
28cb0 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65  semblePage(pPage
28cc0 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c  , pChild->nCell,
28cd0 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29   apCell, szCell)
28ce0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;.        /* Cop
28cf0 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  y the right-poin
28d00 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
28d10 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20   to the parent. 
28d20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  */.        put4b
28d30 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
28d40 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
28d50 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20  et+8], .        
28d60 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43      get4byte(&pC
28d70 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69  hild->aData[pChi
28d80 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
28d90 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  ));.        free
28da0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
28db0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
28dc0 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
28dd0 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65  transfer to page
28de0 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
28df0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gno));.      }el
28e00 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
28e10 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
28e20 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
28e30 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
28e40 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20  he root..       
28e50 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
28e60 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
28e70 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
28e80 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  /.        TRACE(
28e90 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
28ea0 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
28eb0 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
28ec0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
28ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28ee0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
28ef0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68  Page->aData, pCh
28f00 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67  ild->aData, pPag
28f10 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
28f20 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
28f30 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
28f40 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
28f50 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  nt = 0;.      rc
28f60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
28f70 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
28f80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28fa0 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
28fb0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
28fc0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28fd0 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
28fe0 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
28ff0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29000 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
29010 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
29020 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
29030 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
29040 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73  (pPage);.    ass
29050 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
29060 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e  rflow==0 );.#ifn
29070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29080 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
29090 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
290a0 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  um ){.      int 
290b0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
290c0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
290d0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
290e0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
290f0 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  vfl(pPage, i);. 
29100 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29120 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
29130 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
29140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29150 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
29160 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
29170 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f  Child);.  }.end_
29180 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a  shallow_balance:
29190 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
291a0 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  apCell);.  retur
291b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
291c0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
291d0 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20   overfull.**.** 
291e0 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e  When this happen
291f0 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  s, Create a new 
29200 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63  child page and c
29210 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  opy the.** conte
29220 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  nts of the root 
29230 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  into the child. 
29240 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72   Then make the r
29250 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65  oot.** page an e
29260 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72  mpty page with r
29270 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69  ightChild pointi
29280 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  ng to the new.**
29290 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c   child.   Finall
292a0 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  y, call balance_
292b0 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68  internal() on th
292c0 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74  e new child.** t
292d0 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70  o cause it to sp
292e0 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lit..*/.static i
292f0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
29300 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
29310 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
29320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
29330 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
29340 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
29350 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
29360 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
29370 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
29380 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
29390 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20  noChild;     /* 
293a0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
293b0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
293c0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
293d0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBt;         /*
293e0 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20   The BTree */.  
293f0 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
29400 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61      /* Total usa
29410 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  ble size of a pa
29420 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ge */.  u8 *data
29430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
29440 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
29450 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75  rent page */.  u
29460 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20  8 *cdata;       
29470 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
29480 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
29490 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
294a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
294b0 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65  et to page heade
294c0 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  r in parent */. 
294d0 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
294e0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
294f0 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72  o content of fir
29500 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e  st cell in paren
29510 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
29520 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
29530 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
29540 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
29550 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  0 );.  pBt = pPa
29560 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
29570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29580 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
29590 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  ) );.  rc = allo
295a0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
295b0 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
295c0 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
295d0 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
295e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
295f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29600 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29610 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
29620 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
29630 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
29640 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ize;.  data = pP
29650 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
29660 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
29670 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65  fset;.  brk = ge
29680 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
29690 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20  +5]);.  cdata = 
296a0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  pChild->aData;. 
296b0 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26   memcpy(cdata, &
296c0 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65  data[hdr], pPage
296d0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
296e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29  Page->nCell-hdr)
296f0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74  ;.  memcpy(&cdat
29700 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72  a[brk], &data[br
29710 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62  k], usableSize-b
29720 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rk);.  assert( p
29730 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30  Child->isInit==0
29740 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
29750 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
29760 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
29770 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29780 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
29790 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  t;.  memcpy(pChi
297a0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
297b0 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
297c0 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
297d0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
297e0 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
297f0 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
29800 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66  >nOverflow;.  if
29810 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
29820 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c  low ){.    pChil
29830 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
29840 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  }.  assert( pChi
29850 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
29860 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72  ->nCell );.  zer
29870 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
29880 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
29890 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
298a0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
298b0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
298c0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
298d0 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ild);.  TRACE(("
298e0 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
298f0 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
29900 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
29910 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23  Child->pgno));.#
29920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29930 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
29940 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
29950 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uum ){.    int i
29960 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
29970 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
29980 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
29990 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
299a0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
299b0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
299c0 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
299d0 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
299e0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
299f0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29a00 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
29a10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29a30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29a40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29a50 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
29a60 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
29a70 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63  pChild);..balanc
29a80 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
29a90 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
29aa0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
29ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
29ac0 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
29ad0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
29ae0 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
29af0 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
29b00 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
29b10 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
29b20 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
29b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
29b40 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
29b50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
29b60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29b70 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
29b80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
29b90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
29ba0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
29bb0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
29bc0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
29bd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29be0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29bf0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
29c00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
29c10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
29c20 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
29c30 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
29c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29c60 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
29c70 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
29c80 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
29c90 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
29ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
29cb0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29cc0 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
29cd0 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
29ce0 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
29cf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
29d00 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
29d10 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
29d20 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
29d30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29d50 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
29d60 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
29d70 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
29d80 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
29d90 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
29da0 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20  ors were opened 
29db0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69  with wrFlag==0 i
29dc0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  n a different.**
29dd0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
29de0 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65  tion (a database
29df0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
29e00 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65   shares the page
29e10 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20  r.** cache with 
29e20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e  the current conn
29e30 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74  ection) and that
29e40 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
29e50 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20  n .** is not in 
29e60 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69  the ReadUncommmi
29e70 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e  tted state, then
29e80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
29e90 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
29ea0 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49  _LOCKED..**.** I
29eb0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68  n addition to ch
29ec0 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d  ecking for read-
29ed0 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20 72  locks (where a r
29ee0 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61  ead-lock .** mea
29ef0 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  ns a cursor open
29f00 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
29f10 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0) this routine 
29f20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c  also moves.** al
29f30 6c 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  l write cursors 
29f40 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
29f50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
29f60 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c 20   .** first Cell 
29f70 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
29f80 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
29f90 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e 20  sary because an 
29fa0 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65  insert .** or de
29fb0 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67  lete might chang
29fc0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
29fd0 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20  cells on a page 
29fe0 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70  or delete.** a p
29ff0 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64  age entirely and
2a000 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
2a010 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72  to leave any cur
2a020 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  sors .** pointin
2a030 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e  g to non-existan
2a040 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73  t pages or cells
2a050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a060 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
2a070 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67  tree *pBtree, Pg
2a080 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43  no pgnoRoot, BtC
2a090 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29  ursor *pExclude)
2a0a0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2a0b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a0c0 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
2a0d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2a0e0 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b  pBtree->pSqlite;
2a0f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a100 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2a110 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
2a120 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
2a130 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
2a140 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45  ){.    if( p==pE
2a150 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75  xclude ) continu
2a160 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  e;.    if( p->eS
2a170 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2a180 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ID ) continue;. 
2a190 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
2a1a0 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63  ot!=pgnoRoot ) c
2a1b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2a1c0 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b   p->wrFlag==0 ){
2a1d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
2a1e0 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74  dbOther = p->pBt
2a1f0 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20  ree->pSqlite;.  
2a200 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d      if( dbOther=
2a210 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  =0 ||.         (
2a220 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28  dbOther!=db && (
2a230 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26  dbOther->flags &
2a240 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2a250 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a  mmitted)==0) ){.
2a260 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2a270 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2a280 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2a290 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67  if( p->pPage->pg
2a2a0 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20  no!=p->pgnoRoot 
2a2b0 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  ){.      moveToR
2a2c0 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  oot(p);.    }.  
2a2d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2a2e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
2a2f0 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
2a300 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
2a310 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
2a320 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
2a330 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
2a340 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
2a350 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
2a360 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
2a370 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
2a380 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
2a390 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
2a3a0 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
2a3b0 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2a3c0 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2a3d0 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2a3e0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
2a3f0 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
2a400 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
2a410 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
2a420 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
2a430 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
2a440 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
2a450 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
2a460 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
2a470 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
2a480 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a490 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
2a4a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2a4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a4c0 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
2a4d0 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
2a4e0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2a4f0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2a500 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2a510 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
2a520 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
2a530 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2a540 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
2a550 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
2a560 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2a570 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a590 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
2a5a0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
2a5b0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
2a5c0 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2a5f0 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
2a600 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
2a610 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2a620 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
2a630 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2a640 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2a650 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2a660 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2a670 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2a680 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2a690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2a6a0 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  wCell = 0;..  as
2a6b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2a6c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2a6d0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2a6e0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2a6f0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2a700 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2a710 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2a720 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
2a730 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2a740 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2a750 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2a760 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2a770 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2a780 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2a790 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2a7a0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2a7b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a7c0 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43  ITE_PERM;   /* C
2a7d0 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66  ursor not open f
2a7e0 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2a7f0 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2a800 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2a810 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2a820 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20  oot, pCur) ){.  
2a830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a840 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
2a850 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
2a860 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
2a870 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ock */.  }..  /*
2a880 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2a890 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2a8a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2a8b0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2a8c0 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2a8d0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
2a8e0 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2a8f0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2a900 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2a910 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2a920 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2a930 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2a940 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2a950 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
2a960 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
2a970 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
2a980 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
2a990 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2a9a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
2a9b0 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
2a9c0 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
2a9d0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
2a9e0 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  | !pPage->leafDa
2a9f0 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ta );.  TRACE(("
2aa00 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
2aa10 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
2aa20 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
2aa30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
2aa40 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
2aa50 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
2aa60 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2aa70 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
2aa80 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
2aa90 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
2aaa0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2aab0 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71  ;.  newCell = sq
2aac0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58  lite3_malloc( MX
2aad0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2aae0 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  );.  if( newCell
2aaf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2ab00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
2ab10 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
2ab20 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
2ab30 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
2ab40 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
2ab50 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
2ab60 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2ab70 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
2ab80 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
2ab90 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
2aba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
2abb0 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
2abc0 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c  (pBt) );.  if( l
2abd0 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2abe0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2abf0 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ate ){.    int s
2ac00 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2ac10 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
2ac20 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
2ac30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2ac40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ac50 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2ac60 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2ac70 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
2ac80 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2ac90 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
2aca0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2acb0 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20   pCur->idx);.   
2acc0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2acd0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
2ace0 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
2acf0 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
2ad00 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
2ad10 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
2ad20 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
2ad30 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2ad40 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69   oldCell);.    i
2ad50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2ad60 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f  _insert;.    dro
2ad70 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2ad80 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  r->idx, szOld);.
2ad90 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
2ada0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
2adb0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
2adc0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2add0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b  ;.    pCur->idx+
2ade0 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  +;.    pCur->inf
2adf0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  o.nSize = 0;.  }
2ae00 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2ae10 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2ae20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
2ae30 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2ae40 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ur->idx, newCell
2ae50 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
2ae60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ae70 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69  _OK ) goto end_i
2ae80 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61  nsert;.  rc = ba
2ae90 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b  lance(pPage, 1);
2aea0 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72  .  /* sqlite3Btr
2aeb0 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d  eePageDump(pCur-
2aec0 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
2aed0 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f  Root, 1); */.  /
2aee0 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  * fflush(stdout)
2aef0 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  ; */.  if( rc==S
2af00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2af10 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2af20 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
2af30 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2af40 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74  (newCell);.  ret
2af50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2af60 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72   Delete the entr
2af70 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
2af80 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2af90 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2afa0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2afb0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2afc0 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  cation..*/.int s
2afd0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2afe0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2aff0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2b000 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2b010 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
2b020 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
2b030 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
2b040 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72  Child = 0;.  Btr
2b050 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
2b060 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
2b070 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2b080 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b090 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b0a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b0b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2b0c0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2b0d0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2b0e0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2b0f0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2b100 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2b110 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a  doing a delete *
2b120 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
2b130 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2b140 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2b150 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
2b160 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2b170 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2b180 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
2b190 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61  pCur->idx >= pPa
2b1a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2b1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2b1c0 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75  RROR;  /* The cu
2b1d0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2b1e0 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67  ting to anything
2b1f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   */.  }.  if( !p
2b200 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2b210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b220 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20  _PERM;   /* Did 
2b230 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75  not open this cu
2b240 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rsor for writing
2b250 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2b260 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2b270 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2b280 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2b290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b2a0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2b2b0 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2b2c0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2b2d0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2b2e0 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
2b2f0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
2b300 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f  r position (a no
2b310 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f  -op if the curso
2b320 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a  r is not in .  *
2b330 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
2b340 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20  SEEK state) and 
2b350 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  save the positio
2b360 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2b370 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70  cursors .  ** op
2b380 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  en on the same t
2b390 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20  able. Then call 
2b3a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b3b0 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  e() on the page.
2b3c0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e    ** that the en
2b3d0 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  try will be dele
2b3e0 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20  ted from..  */. 
2b3f0 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20   if( .    (rc = 
2b400 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
2b410 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b420 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2b430 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2b440 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2b450 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
2b460 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2b470 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b480 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b490 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  )!=0.  ){.    re
2b4a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2b4b0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65  /* Locate the ce
2b4c0 6c 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70  ll within it's p
2b4d0 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2b4e0 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2b4f0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2b500 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2b510 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2b520 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2b530 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2b540 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2b550 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2b560 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2b570 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  /.  pCell = find
2b580 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b590 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  ->idx);.  if( !p
2b5a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b5b0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2b5c0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2b5d0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2b5e0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2b5f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2b600 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b610 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
2b620 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
2b630 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
2b640 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2b650 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
2b660 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
2b670 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
2b680 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
2b690 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
2b6a0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
2b6b0 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
2b6c0 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
2b6d0 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
2b6e0 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
2b6f0 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
2b700 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
2b710 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
2b720 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
2b730 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
2b740 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
2b750 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
2b760 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
2b770 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
2b780 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Cur;.    unsigne
2b790 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20  d char *pNext;. 
2b7a0 20 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b 20 20     int szNext;  
2b7b0 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c 65 72 20  /* The compiler 
2b7c0 77 61 72 6e 69 6e 67 20 69 73 20 77 72 6f 6e 67  warning is wrong
2b7d0 3a 20 73 7a 4e 65 78 74 20 69 73 20 61 6c 77 61  : szNext is alwa
2b7e0 79 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ys .            
2b7f0 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
2b800 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20  zed before use. 
2b810 20 41 64 64 69 6e 67 20 61 6e 20 65 78 74 72 61   Adding an extra
2b820 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b840 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20 74   ** to silence t
2b850 68 65 20 63 6f 6d 70 69 6c 65 72 20 73 6c 6f 77  he compiler slow
2b860 73 20 64 6f 77 6e 20 74 68 65 20 63 6f 64 65 2e  s down the code.
2b870 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55   */.    int notU
2b880 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  sed;.    unsigne
2b890 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c  d char *tempCell
2b8a0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2b8b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  ( !pPage->leafDa
2b8c0 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ta );.    sqlite
2b8d0 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
2b8e0 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43  sor(pCur, &leafC
2b8f0 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ur);.    rc = sq
2b900 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
2b910 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
2b920 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2b930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b950 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75  agerWrite(leafCu
2b960 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r.pPage->pDbPage
2b970 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b990 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  {.      TRACE(("
2b9a0 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2b9b0 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2b9c0 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2b9d0 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2b9e0 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2b9f0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2ba00 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e  ->pgno, leafCur.
2ba10 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2ba20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2ba30 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2ba40 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2ba50 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2ba60 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65    pNext = findCe
2ba70 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2ba80 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a  , leafCur.idx);.
2ba90 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63        szNext = c
2baa0 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43  ellSizePtr(leafC
2bab0 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29  ur.pPage, pNext)
2bac0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2bad0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2bae0 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20  )>=szNext+4 );. 
2baf0 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
2bb00 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
2bb10 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2bb20 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ) );.      if( t
2bb30 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2bb40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2bb50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2bb60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2bb70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bb80 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2bb90 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2bba0 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  r->idx, pNext-4,
2bbb0 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2bbc0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ell, 0);.    }. 
2bbd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bbe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
2bbf0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2bc00 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  lowCell(pPage, p
2bc10 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43  Cur->idx), pgnoC
2bc20 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20  hild);.      rc 
2bc30 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2bc40 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
2bc50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bc60 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65   ){.      dropCe
2bc70 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2bc80 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2bc90 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63  zNext);.      rc
2bca0 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43   = balance(leafC
2bcb0 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ur.pPage, 0);.  
2bcc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2bcd0 66 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  free(tempCell);.
2bce0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2bcf0 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
2bd00 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d  r(&leafCur);.  }
2bd10 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28  else{.    TRACE(
2bd20 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
2bd30 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c  %d delete from l
2bd40 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
2bd50 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2bd60 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
2bd70 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2bd80 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2bd90 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2bda0 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2bdb0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2bdc0 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ge, 0);.  }.  if
2bdd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bde0 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2bdf0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
2be00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2be10 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2be20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
2be30 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
2be40 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
2be50 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
2be60 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
2be70 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
2be80 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
2be90 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
2bea0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2beb0 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
2bec0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
2bed0 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
2bee0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
2bef0 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
2bf00 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
2bf10 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
2bf20 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
2bf30 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
2bf40 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
2bf50 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
2bf60 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
2bf70 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
2bf80 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
2bf90 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
2bfa0 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
2bfb0 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74  c int btreeCreat
2bfc0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
2bfd0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
2bfe0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
2bff0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2c000 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
2c010 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
2c020 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
2c030 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2c040 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2c050 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
2c060 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2c070 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2c080 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2c090 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2c0a0 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20  on first */.    
2c0b0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2c0c0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2c0d0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2c0e0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2c0f0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2c100 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2c110 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
2c120 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c130 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
2c140 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2c150 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2c160 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
2c170 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
2c180 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
2c190 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2c1a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
2c1b0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
2c1c0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
2c1d0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
2c1e0 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
2c1f0 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
2c200 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
2c210 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
2c220 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
2c230 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
2c240 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
2c250 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
2c260 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
2c270 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
2c280 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2c290 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
2c2a0 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
2c2b0 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
2c2c0 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
2c2d0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2c2e0 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
2c2f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
2c300 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
2c310 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
2c320 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
2c330 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
2c340 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
2c350 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
2c360 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
2c370 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
2c380 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
2c390 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
2c3a0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
2c3b0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
2c3c0 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
2c3d0 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
2c3e0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2c3f0 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
2c400 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
2c410 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
2c420 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
2c430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c440 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2c450 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
2c460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2c480 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2c490 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
2c4a0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
2c4b0 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
2c4c0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
2c4d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
2c4e0 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
2c4f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
2c500 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2c510 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  f( pgnoRoot==PTR
2c520 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2c530 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
2c540 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
2c550 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2c560 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
2c570 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
2c580 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2c590 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
2c5a0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
2c5b0 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
2c5c0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
2c5d0 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
2c5e0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2c5f0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
2c600 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
2c610 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
2c620 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
2c630 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
2c640 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
2c650 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
2c660 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2c670 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
2c680 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
2c690 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
2c6a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c6b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2c6c0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2c6d0 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
2c6e0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
2c6f0 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
2c700 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
2c710 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
2c720 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
2c730 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
2c740 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
2c750 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
2c760 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
2c770 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
2c780 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
2c790 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
2c7a0 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
2c7b0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2c7c0 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
2c7d0 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
2c7e0 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
2c7f0 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
2c800 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
2c810 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
2c820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c830 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2c840 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
2c850 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2c860 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
2c870 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
2c880 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
2c890 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
2c8a0 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
2c8b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c8c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c8d0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2c8e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2c8f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c900 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c910 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2c920 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2c930 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2c940 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
2c950 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2c960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
2c970 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
2c980 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
2c990 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2c9a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2c9b0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2c9c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c9d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c9e0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2c9f0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
2ca00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ca10 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
2ca20 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
2ca30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ca40 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2ca50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2ca60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ca70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2ca80 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2ca90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2caa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cab0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2cac0 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2cad0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2cae0 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
2caf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2cb00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62  t);..      /* Ob
2cb10 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74  tain the page at
2cb20 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20   pgnoRoot */.   
2cb30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cb40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cb50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2cb60 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2cb70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2cb80 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2cb90 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2cba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cbb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cbc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2cbd0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2cbe0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2cbf0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2cc00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2cc10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2cc30 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2cc40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2cc50 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2cc60 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67      pRoot = pPag
2cc70 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20  eMove;.    } .. 
2cc80 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2cc90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64   pointer-map and
2cca0 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20   meta-data with 
2ccb0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2ccc0 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  e number. */.   
2ccd0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2cce0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50  pBt, pgnoRoot, P
2ccf0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2cd00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2cd10 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2cd20 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2cd30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cd40 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2cd50 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2cd60 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f  ta(p, 4, pgnoRoo
2cd70 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2cd80 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2cd90 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2cda0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cdb0 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
2cdc0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2cdd0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
2cde0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
2cdf0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
2ce00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ce10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
2ce20 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2ce30 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
2ce40 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2ce50 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
2ce60 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41   flags | PTF_LEA
2ce70 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  F);.  sqlite3Pag
2ce80 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70  erUnref(pRoot->p
2ce90 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61  DbPage);.  *piTa
2cea0 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
2ceb0 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
2cec0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
2ced0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
2cee0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
2cef0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
2cf00 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
2cf10 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
2cf20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
2cf30 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54  c = btreeCreateT
2cf40 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c  able(p, piTable,
2cf50 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74   flags);.  sqlit
2cf60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2cf70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2cf80 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
2cf90 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
2cfa0 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
2cfb0 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
2cfc0 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
2cfd0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
2cfe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2cff0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2d000 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d010 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2d020 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
2d030 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
2d040 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
2d050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d060 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
2d070 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ear */.  MemPage
2d080 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
2d090 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20  * Parent page.  
2d0a0 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f  NULL for the roo
2d0b0 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  t */.  int freeP
2d0c0 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20  ageFlag      /* 
2d0d0 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
2d0e0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2d0f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2d100 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
2d110 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d120 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
2d130 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d140 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2d150 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2d160 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  ( pgno>sqlite3Pa
2d170 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
2d180 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2d190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2d1a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2d1b0 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
2d1c0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2d1d0 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
2d1e0 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
2d1f0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2d200 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
2d210 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2d220 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2d230 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2d240 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
2d250 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2d260 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2d270 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2d280 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2d290 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
2d2a0 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2d2b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d2c0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2d2d0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2d2e0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2d2f0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2d300 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d310 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2d320 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2d330 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d340 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2d350 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2d360 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2d370 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
2d380 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2d390 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2d3a0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2d3b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2d3c0 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
2d3d0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
2d3e0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2d3f0 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
2d400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d410 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2d420 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65  e))==0 ){.    ze
2d430 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
2d440 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
2d450 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
2d460 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2d470 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
2d480 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2d490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d4a0 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
2d4b0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
2d4c0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2d4d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2d4e0 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
2d4f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2d500 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2d510 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
2d520 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2d530 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
2d540 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
2d550 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
2d560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2d570 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2d580 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2d590 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2d5a0 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
2d5b0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2d5c0 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
2d5d0 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
2d5e0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
2d5f0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
2d600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d610 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
2d620 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2d630 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
2d640 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2d650 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
2d660 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2d670 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2d680 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2d690 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
2d6a0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2d6b0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2d6c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2d6d0 73 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65  se if( (rc = che
2d6e0 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
2d6f0 54 61 62 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49  Table, 0))!=SQLI
2d700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
2d710 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
2d720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c  .  }else if( SQL
2d730 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2d740 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2d750 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b  , iTable, 0)) ){
2d760 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
2d770 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
2d780 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2d790 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2d7a0 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2d7b0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
2d7c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2d7d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
2d7f0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2d800 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64  n a table and ad
2d810 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  d the root of th
2d820 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68  e table to.** th
2d830 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63  e freelist.  Exc
2d840 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66  ept, the root of
2d850 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74   the principle t
2d860 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e  able (the one on
2d870 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e  .** page 1) is n
2d880 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68  ever added to th
2d890 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
2d8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2d8b0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
2d8c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
2d8d0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
2d8e0 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20  n.** cursors on 
2d8f0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2d900 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2d910 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68  s enabled and th
2d920 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65  e page at iTable
2d930 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
2d940 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  .** root page in
2d950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d960 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  le, then the las
2d970 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20  t root page .** 
2d980 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d990 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e  file is moved in
2d9a0 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d  to the slot form
2d9b0 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2d9c0 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74  .** iTable and t
2d9d0 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f  hat last slot fo
2d9e0 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2d9f0 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  by the last root
2da00 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65   page.** is adde
2da10 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2da20 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61  t instead of iTa
2da30 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61  ble.  In this sa
2da40 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70  y, all.** root p
2da50 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74  ages are kept at
2da60 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2da70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2da80 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  ile, which.** is
2da90 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41   necessary for A
2daa0 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72  UTOVACUUM to wor
2dab0 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76  k right.  *piMov
2dac0 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ed is set to the
2dad0 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72   .** page number
2dae0 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65   that used to be
2daf0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2db00 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
2db10 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f  before.** the mo
2db20 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20  ve.  If no page 
2db30 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d  gets moved, *piM
2db40 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30  oved is set to 0
2db50 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f  ..** The last ro
2db60 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72  ot page is recor
2db70 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61  ded in meta[3] a
2db80 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  nd the value of.
2db90 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70  ** meta[3] is up
2dba0 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72  dated by this pr
2dbb0 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ocedure..*/.stat
2dbc0 69 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70  ic int btreeDrop
2dbd0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2dbe0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
2dbf0 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  *piMoved){.  int
2dc00 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2dc10 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53  pPage = 0;.  BtS
2dc20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2dc30 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2dc40 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2dc50 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
2dc60 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2dc70 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2dc80 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2dc90 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2dca0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2dcb0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
2dcc0 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
2dcd0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
2dce0 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
2dcf0 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
2dd00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
2dd10 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
2dd20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2dd30 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
2dd40 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
2dd50 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
2dd60 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
2dd70 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2dd80 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
2dd90 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
2dda0 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
2ddb0 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
2ddc0 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
2ddd0 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
2dde0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
2ddf0 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
2de00 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2de10 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2de20 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2de30 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2de40 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  le, &pPage, 0);.
2de50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2de60 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
2de70 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2de80 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a  ble(p, iTable);.
2de90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dea0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2deb0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
2dec0 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
2ded0 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
2dee0 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
2def0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2df00 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
2df10 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2df20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2df30 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
2df40 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2df50 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2df60 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
2df70 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
2df80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2df90 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
2dfa0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
2dfb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dfc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2dfd0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2dfe0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2dff0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2e000 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
2e010 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
2e020 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
2e030 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2e040 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
2e050 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2e060 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
2e070 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
2e080 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
2e090 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2e0a0 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
2e0b0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2e0c0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2e0d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2e0e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e0f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2e100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2e120 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2e130 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2e140 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2e150 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
2e160 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
2e170 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2e180 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2e190 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2e1a0 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
2e1b0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
2e1c0 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
2e1d0 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
2e1e0 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2e1f0 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
2e200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e210 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
2e220 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e230 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2e240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e250 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2e260 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
2e270 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
2e280 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e2a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2e2c0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
2e2d0 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52  (pBt, pMove, PTR
2e2e0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
2e2f0 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
2e300 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
2e310 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
2e320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2e340 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2e350 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
2e360 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2e370 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2e380 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2e390 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2e3a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e3b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2e3c0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2e3d0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2e3e0 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2e3f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e400 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2e410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2e430 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2e440 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f   }.        *piMo
2e450 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e  ved = maxRootPgn
2e460 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
2e470 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77    /* Set the new
2e480 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27   'max-root-page'
2e490 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61   value in the da
2e4a0 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54  tabase header. T
2e4b0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
2e4c0 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65  the old value le
2e4d0 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65  ss one, less one
2e4e0 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61   more if that ha
2e4f0 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a  ppens to.      *
2e500 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  * be a root-page
2e510 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e   number, less on
2e520 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20  e again if that 
2e530 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
2e540 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2e550 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  E..      */.    
2e560 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2e570 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2e580 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  otPgno==PENDING_
2e590 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2e5a0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2e5b0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2e5c0 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2e5d0 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50  otPgno==PTRMAP_P
2e5e0 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f  AGENO(pBt, maxRo
2e5f0 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  otPgno) ){.     
2e600 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2e610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e620 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50  assert( maxRootP
2e630 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2e640 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2e650 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e660 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2e670 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50  a(p, 4, maxRootP
2e680 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gno);.    }else{
2e690 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2e6a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2e6b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e6c0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
2e6d0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
2e6e0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74   /* If sqlite3Bt
2e6f0 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73  reeDropTable was
2e700 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
2e710 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61  1. */.    zeroPa
2e720 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e  ge(pPage, PTF_IN
2e730 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b  TKEY|PTF_LEAF );
2e740 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2e750 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
2e760 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e  eturn rc;  .}.in
2e770 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  t sqlite3BtreeDr
2e780 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2e790 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2e7a0 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2e7b0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2e7c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2e7d0 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54   rc = btreeDropT
2e7e0 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20  able(p, iTable, 
2e7f0 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69  piMoved);.  sqli
2e800 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2e810 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e820 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
2e830 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
2e840 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61  on out of a data
2e850 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61  base file.  Meta
2e860 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75  [0].** is the nu
2e870 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
2e880 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
2e890 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
2e8a0 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67  eta[1].** throug
2e8b0 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61  h meta[15] are a
2e8c0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
2e8d0 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72   by higher layer
2e8e0 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  s.  Meta[0].** i
2e8f0 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
2e900 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64   others are read
2e910 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  /write..** .** T
2e920 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20  he schema layer 
2e930 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c  numbers meta val
2e940 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e  ues differently.
2e950 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a    At the schema.
2e960 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68  ** layer (and th
2e970 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20  e SetCookie and 
2e980 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64  ReadCookie opcod
2e990 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  es) the number o
2e9a0 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20  f.** free pages 
2e9b0 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20  is not visible. 
2e9c0 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73   So Cookie[0] is
2e9d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74   the same as Met
2e9e0 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  a[1]..*/.int sql
2e9f0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2ea00 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2ea10 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b  dx, u32 *pMeta){
2ea20 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
2ea30 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ge;.  int rc;.  
2ea40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2ea50 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  P1;.  BtShared *
2ea60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2ea70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2ea80 65 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  er(p);..  /* Rea
2ea90 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61  ding a meta-data
2eaa0 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20   value requires 
2eab0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  a read-lock on p
2eac0 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65  age 1 (and hence
2ead0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
2eae0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57  _master table. W
2eaf0 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b  e grab this lock
2eb00 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2eb10 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e  hether or.  ** n
2eb20 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  ot the SQLITE_Re
2eb30 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
2eb40 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74  ag is set (the t
2eb50 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
2eb60 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72  age.  ** 1 is tr
2eb70 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69  eated as a speci
2eb80 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79  al case by query
2eb90 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20  TableLock() and 
2eba0 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20  lockTable())..  
2ebb0 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  */.  rc = queryT
2ebc0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
2ebd0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
2ebe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ebf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
2ec00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
2ec10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2ec20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2ec30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2ec40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ec50 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
2ec60 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b  r, 1, &pDbPage);
2ec70 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2ec80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2ec90 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
2eca0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20  n rc;.  }.  pP1 
2ecb0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2ecc0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
2ecd0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
2ece0 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34  .  *pMeta = get4
2ecf0 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
2ed00 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65  dx*4]);.  sqlite
2ed10 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
2ed20 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  age);..  /* If a
2ed30 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64  utovacuumed is d
2ed40 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  isabled in this 
2ed50 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65  build but we are
2ed60 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a   trying to .  **
2ed70 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76   access an autov
2ed80 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65  acuumed database
2ed90 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20  , then make the 
2eda0 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c  database readonl
2edb0 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  y. .  */.#ifdef 
2edc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2edd0 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78  VACUUM.  if( idx
2ede0 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20  ==4 && *pMeta>0 
2edf0 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ) pBt->readOnly 
2ee00 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  = 1;.#endif..  /
2ee10 2a 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d  * Grab the read-
2ee20 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20  lock on page 1. 
2ee30 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61  */.  rc = lockTa
2ee40 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ble(p, 1, READ_L
2ee50 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OCK);.  sqlite3B
2ee60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2ee70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ee80 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69  .** Write meta-i
2ee90 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20  nformation back 
2eea0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
2eeb0 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a  e.  Meta[0] is.*
2eec0 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  * read-only and 
2eed0 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74  may not be writt
2eee0 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
2eef0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2ef00 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
2ef10 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b  idx, u32 iMeta){
2ef20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2ef30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2ef40 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
2ef50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2ef60 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69  ert( idx>=1 && i
2ef70 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69  dx<=15 );.  sqli
2ef80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
2ef90 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
2efa0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2efb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
2efc0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2efd0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2efe0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
2eff0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2f000 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
2f010 29 3b 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74  );.    pP1 = pBt
2f020 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
2f030 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f040 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
2f050 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
2f060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2f070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f080 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b    put4byte(&pP1[
2f090 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65  36 + idx*4], iMe
2f0a0 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ta);.      if( i
2f0b0 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  dx==7 ){.       
2f0c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
2f0d0 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74  toVacuum || iMet
2f0e0 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  a==0 );.        
2f0f0 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30  assert( iMeta==0
2f100 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a   || iMeta==1 );.
2f110 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
2f120 72 56 61 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b  rVacuum = iMeta;
2f130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f140 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
2f150 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2f160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f170 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67   Return the flag
2f180 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67   byte at the beg
2f190 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61  inning of the pa
2f1a0 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ge that the curs
2f1b0 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
2f1c0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  ly pointing to..
2f1d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2f1e0 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f  reeFlags(BtCurso
2f1f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
2f200 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20  ODO: What about 
2f210 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f220 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62  EK state? Probab
2f230 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a  ly need to call.
2f240 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c    ** restoreOrCl
2f250 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2f260 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  n() here..  */. 
2f270 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2f280 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2f290 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2f2a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2f2b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f2c0 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70  ge->pBt==pCur->p
2f2d0 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Bt );.  return p
2f2e0 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44  Page ? pPage->aD
2f2f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2f300 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f  fset] : 0;.}.../
2f310 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2f320 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
2f330 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20   with a BTree.  
2f340 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2f350 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
2f360 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2f370 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72  g only..*/.Pager
2f380 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
2f390 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ger(Btree *p){. 
2f3a0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
2f3b0 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64  pPager;.}..#ifnd
2f3c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2f3d0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
2f3e0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65  *.** Append a me
2f3f0 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72  ssage to the err
2f400 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
2f410 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
2f420 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  d checkAppendMsg
2f430 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
2f440 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20  *pCheck,.  char 
2f450 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zMsg1,.  const 
2f460 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20  char *zFormat,. 
2f470 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73   ....){.  va_lis
2f480 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  t ap;.  char *zM
2f490 73 67 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65  sg2;.  if( !pChe
2f4a0 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75  ck->mxErr ) retu
2f4b0 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78  rn;.  pCheck->mx
2f4c0 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d  Err--;.  pCheck-
2f4d0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74  >nErr++;.  va_st
2f4e0 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2f4f0 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69  ;.  zMsg2 = sqli
2f500 74 65 33 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a  te3VMPrintf(0, z
2f510 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2f520 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2f530 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67   zMsg1==0 ) zMsg
2f540 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43  1 = "";.  if( pC
2f550 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  heck->zErrMsg ){
2f560 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20  .    char *zOld 
2f570 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  = pCheck->zErrMs
2f580 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a  g;.    pCheck->z
2f590 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
2f5a0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
2f5b0 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  (&pCheck->zErrMs
2f5c0 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a  g, zOld, "\n", z
2f5d0 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68  Msg1, zMsg2, (ch
2f5e0 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)0);.    sqli
2f5f0 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a  te3_free(zOld);.
2f600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2f610 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2f620 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
2f630 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63  zMsg1, zMsg2, (c
2f640 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73  har*)0);.  }.  s
2f650 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67  qlite3_free(zMsg
2f660 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  2);.}.#endif /* 
2f670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2f680 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
2f690 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f6a0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2f6b0 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20  ECK./*.** Add 1 
2f6c0 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
2f6d0 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
2f6e0 69 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20  iPage.  If this 
2f6f0 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  is the second.**
2f700 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2f710 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65  e page, add an e
2f720 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
2f730 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e  pCheck->zErrMsg.
2f740 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
2f750 74 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20  there are 2 ore 
2f760 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20  more references 
2f770 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
2f780 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20  0 if.** if this 
2f790 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66  is the first ref
2f7a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
2f7b0 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63  ge..**.** Also c
2f7c0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2f7d0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20  ge number is in 
2f7e0 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  bounds..*/.stati
2f7f0 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49  c int checkRef(I
2f800 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
2f810 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63  ck, int iPage, c
2f820 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a  har *zContext){.
2f830 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
2f840 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2f850 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e   iPage>pCheck->n
2f860 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20  Page || iPage<0 
2f870 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2f880 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2f890 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64  ontext, "invalid
2f8a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22   page number %d"
2f8b0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
2f8c0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2f8d0 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b  ( pCheck->anRef[
2f8e0 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20  iPage]==1 ){.   
2f8f0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2f900 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2f910 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65  , "2nd reference
2f920 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50   to page %d", iP
2f930 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2f940 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2f950 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66    (pCheck->anRef
2f960 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a  [iPage]++)>1;.}.
2f970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f980 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2f990 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2f9a0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
2f9b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f  e pointer-map fo
2f9c0 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61  r page iChild ma
2f9d0 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69  ps to .** page i
2f9e0 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20  Parent, pointer 
2f9f0 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66  type ptrType. If
2fa00 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20   not, append an 
2fa10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2fa20 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73   to pCheck..*/.s
2fa30 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
2fa40 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72  Ptrmap(.  Integr
2fa50 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
2fa60 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
2fa70 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  eck context */. 
2fa80 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2fa90 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
2faa0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2fab0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
2fac0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
2fad0 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
2fae0 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   type */.  Pgno 
2faf0 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  iParent,        
2fb00 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
2fb10 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74  inter map parent
2fb20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2fb30 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
2fb40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2fb50 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
2fb60 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20  (used for error 
2fb70 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  msg) */.){.  int
2fb80 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61   rc;.  u8 ePtrma
2fb90 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pType;.  Pgno iP
2fba0 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20  trmapParent;..  
2fbb0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2fbc0 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69  Check->pBt, iChi
2fbd0 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65  ld, &ePtrmapType
2fbe0 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74  , &iPtrmapParent
2fbf0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2fc00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
2fc10 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2fc20 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
2fc30 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70  Failed to read p
2fc40 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69  trmap key=%d", i
2fc50 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
2fc60 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  rn;.  }..  if( e
2fc70 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70  PtrmapType!=eTyp
2fc80 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65  e || iPtrmapPare
2fc90 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20  nt!=iParent ){. 
2fca0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2fcb0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2fcc0 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20  xt, .      "Bad 
2fcd0 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65  ptr map entry ke
2fce0 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25  y=%d expected=(%
2fcf0 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64  d,%d) got=(%d,%d
2fd00 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c  )", .      iChil
2fd10 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e  d, eType, iParen
2fd20 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20  t, ePtrmapType, 
2fd30 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
2fd40 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
2fd50 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e  .** Check the in
2fd60 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
2fd70 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e  reelist or of an
2fd80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
2fd90 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74  ist..** Verify t
2fda0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
2fdb0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c  f pages on the l
2fdc0 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61  ist is N..*/.sta
2fdd0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69  tic void checkLi
2fde0 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  st(.  IntegrityC
2fdf0 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49  k *pCheck,  /* I
2fe00 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
2fe10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
2fe20 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20  nt isFreeList,  
2fe30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2fe40 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61   a freelist.  Fa
2fe50 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  lse for overflow
2fe60 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20   page list */.  
2fe70 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
2fe80 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2fe90 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70  mber for first p
2fea0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
2feb0 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
2fec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2fed0 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
2fee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
2fef0 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  st */.  char *zC
2ff00 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a  ontext        /*
2ff10 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   Context for err
2ff20 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29  or messages */.)
2ff30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
2ff40 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20   expected = N;. 
2ff50 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50   int iFirst = iP
2ff60 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d  age;.  while( N-
2ff70 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d  - > 0 && pCheck-
2ff80 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62  >mxErr ){.    Db
2ff90 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b  Page *pOvflPage;
2ffa0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2ffb0 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20  ar *pOvflData;. 
2ffc0 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29     if( iPage<1 )
2ffd0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
2ffe0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
2fff0 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
30000 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65    "%d of %d page
30010 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f  s missing from o
30020 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61  verflow list sta
30030 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20  rting at %d",.  
30040 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70          N+1, exp
30050 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a  ected, iFirst);.
30060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30070 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
30080 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
30090 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62  e, zContext) ) b
300a0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
300b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43  lite3PagerGet(pC
300c0 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50  heck->pPager, (P
300d0 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66  gno)iPage, &pOvf
300e0 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  lPage) ){.      
300f0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30100 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30110 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
30120 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
30130 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30140 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61     }.    pOvflDa
30150 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
30160 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
30170 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50  erGetData(pOvflP
30180 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  age);.    if( is
30190 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
301a0 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
301b0 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d  te(&pOvflData[4]
301c0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
301d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
301e0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  M.      if( pChe
301f0 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
30200 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
30210 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
30220 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  k, iPage, PTRMAP
30230 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
30240 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
30250 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
30260 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d  ( n>pCheck->pBt-
30270 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20  >usableSize/4-8 
30280 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
30290 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
302a0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
302b0 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74         "freelist
302c0 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20   leaf count too 
302d0 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c  big on page %d",
302e0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
302f0 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   N--;.      }els
30300 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
30310 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
30320 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
30330 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79  reePage = get4by
30340 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b  te(&pOvflData[8+
30350 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  i*4]);.#ifndef S
30360 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30370 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20  ACUUM.          
30380 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
30390 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
303a0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
303b0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
303c0 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50  FreePage, PTRMAP
303d0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
303e0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
303f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
30400 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70        checkRef(p
30410 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
30420 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
30430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e       }.        N
30440 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   -= n;.      }. 
30450 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
30460 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30470 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  UUM.    else{.  
30480 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64      /* If this d
30490 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
304a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64   auto-vacuum and
304b0 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68   iPage is not th
304c0 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
304d0 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65  page in this ove
304e0 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63  rflow list, chec
304f0 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74  k that the point
30500 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
30510 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  .      ** the fo
30520 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74  llowing page mat
30530 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20  ches iPage..    
30540 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
30550 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
30560 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b  Vacuum && N>0 ){
30570 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74  .        i = get
30580 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
30590 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  ;.        checkP
305a0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c  trmap(pCheck, i,
305b0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
305c0 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  2, iPage, zConte
305d0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
305e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50   }.#endif.    iP
305f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70  age = get4byte(p
30600 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73  OvflData);.    s
30610 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
30620 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d  (pOvflPage);.  }
30630 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
30640 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
30650 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
30660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30670 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
30680 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75  ./*.** Do variou
30690 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20  s sanity checks 
306a0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
306b0 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74   of a tree.  Ret
306c0 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  urn.** the tree 
306d0 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67  depth.  Root pag
306e0 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61  es return 0.  Pa
306f0 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61  rents of root pa
30700 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c  ges.** return 1,
30710 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   and so forth..*
30720 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63  * .** These chec
30730 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a  ks are done:.**.
30740 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65  **      1.  Make
30750 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73   sure that cells
30760 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20   and freeblocks 
30770 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a  do not overlap.*
30780 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63  *          but c
30790 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65  ombine to comple
307a0 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70  tely cover the p
307b0 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20  age..**  NO  2. 
307c0 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20   Make sure cell 
307d0 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65  keys are in orde
307e0 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d  r..**  NO  3.  M
307f0 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
30800 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
30810 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42  equal to zLowerB
30820 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e  ound..**  NO  4.
30830 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
30840 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ey is greater th
30850 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
30860 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  UpperBound..**  
30870 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68      5.  Check th
30880 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f  e integrity of o
30890 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
308a0 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72  *      6.  Recur
308b0 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63  sively call chec
308c0 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c  kTreePage on all
308d0 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20   children..**   
308e0 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68     7.  Verify th
308f0 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  at the depth of 
30900 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20  all children is 
30910 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20  the same..**    
30920 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    8.  Make sure 
30930 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20  this page is at 
30940 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f  least 33% full o
30950 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20  r else it is.** 
30960 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f           the roo
30970 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a  t of the tree..*
30980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
30990 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e  ckTreePage(.  In
309a0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
309b0 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66  k,  /* Context f
309c0 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
309d0 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  eck */.  int iPa
309e0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
309f0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
30a00 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65   the page to che
30a10 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ck */.  MemPage 
30a20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
30a30 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   Parent page */.
30a40 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43    char *zParentC
30a50 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e  ontext  /* Paren
30a60 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  t context */.){.
30a70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30a80 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64  ;.  int i, rc, d
30a90 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20  epth, d2, pgno, 
30aa0 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20  cnt;.  int hdr, 
30ab0 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74  cellStart;.  int
30ac0 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61   nCell;.  u8 *da
30ad0 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
30ae0 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  pBt;.  int usabl
30af0 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43  eSize;.  char zC
30b00 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63  ontext[100];.  c
30b10 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c  har *hit;..  sql
30b20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30b30 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
30b40 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20  zContext, "Page 
30b50 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a  %d: ", iPage);..
30b60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
30b70 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a  the page exists.
30b80 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68    */.  pBt = pCh
30b90 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
30ba0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
30bb0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
30bc0 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
30bd0 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
30be0 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
30bf0 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
30c00 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
30c10 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
30c20 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
30c30 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
30c40 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
30c50 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
30c60 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
30c70 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
30c80 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
30c90 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
30ca0 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
30cb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
30cc0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
30cd0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
30ce0 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29  pPage, pParent))
30cf0 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
30d00 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30d10 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
30d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d30 22 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69  "sqlite3BtreeIni
30d40 74 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20  tPage() returns 
30d50 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20  error code %d", 
30d60 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  rc);.    release
30d70 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
30d80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
30d90 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61    /* Check out a
30da0 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20  ll the cells..  
30db0 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a  */.  depth = 0;.
30dc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
30dd0 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68  ge->nCell && pCh
30de0 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29  eck->mxErr; i++)
30df0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  {.    u8 *pCell;
30e00 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20  .    int sz;.   
30e10 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
30e20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61  .    /* Check pa
30e30 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70  yload overflow p
30e40 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ages.    */.    
30e50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30e60 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
30e70 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  ), zContext,.   
30e80 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72            "On tr
30e90 65 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20  ee page %d cell 
30ea0 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29  %d: ", iPage, i)
30eb0 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
30ec0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b  ndCell(pPage,i);
30ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
30ee0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
30ef0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
30f00 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66  o);.    sz = inf
30f10 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28  o.nData;.    if(
30f20 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
30f30 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65  ) sz += info.nKe
30f40 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  y;.    assert( s
30f50 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  z==info.nPayload
30f60 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69   );.    if( sz>i
30f70 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
30f80 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
30f90 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  (sz - info.nLoca
30fa0 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  l + usableSize -
30fb0 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20   5)/(usableSize 
30fc0 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f  - 4);.      Pgno
30fd0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
30fe0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
30ff0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69  .iOverflow]);.#i
31000 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31010 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31020 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
31030 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
31040 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31050 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  heck, pgnoOvfl, 
31060 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
31070 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31080 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
31090 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69  if.      checkLi
310a0 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67  st(pCheck, 0, pg
310b0 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a  noOvfl, nPage, z
310c0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  Context);.    }.
310d0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61  .    /* Check sa
310e0 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69  nity of left chi
310f0 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ld page..    */.
31100 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31110 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67  leaf ){.      pg
31120 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
31130 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
31140 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31150 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
31160 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31170 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
31180 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
31190 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
311a0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
311b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
311c0 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68  if.      d2 = ch
311d0 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
311e0 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43  ck,pgno,pPage,zC
311f0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69  ontext);.      i
31200 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65  f( i>0 && d2!=de
31210 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63  pth ){.        c
31220 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31230 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31240 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74  "Child page dept
31250 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20  h differs");.   
31260 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68     }.      depth
31270 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = d2;.    }.  }
31280 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
31290 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
312a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
312b0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
312c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
312d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
312e0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
312f0 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  ext), zContext, 
31300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31310 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25        "On page %
31320 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64  d at right child
31330 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  : ", iPage);.#if
31340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31350 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31360 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31370 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  uum ){.      che
31380 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31390 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
313a0 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a  REE, iPage, 0);.
313b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
313c0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
313d0 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61  Check, pgno, pPa
313e0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
313f0 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20   }. .  /* Check 
31400 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76  for complete cov
31410 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  erage of the pag
31420 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20  e.  */.  data = 
31430 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
31440 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
31450 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20  Offset;.  hit = 
31460 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
31470 6f 28 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  o( usableSize );
31480 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20  .  if( hit ){.  
31490 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c    memset(hit, 1,
314a0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
314b0 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43  hdr+5]));.    nC
314c0 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
314d0 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
314e0 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64    cellStart = hd
314f0 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
31500 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28  ->leaf;.    for(
31510 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
31520 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63  +){.      int pc
31530 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
31540 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d  a[cellStart+i*2]
31550 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  );.      int siz
31560 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
31570 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
31580 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
31590 20 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69        if( (pc+si
315a0 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a  ze-1)>=usableSiz
315b0 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20  e || pc<0 ){.   
315c0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
315d0 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
315e0 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72              "Cor
315f0 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64  ruption detected
31600 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70   in cell %d on p
31610 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c  age %d",i,iPage,
31620 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
31630 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  .        for(j=p
31640 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b  c+size-1; j>=pc;
31650 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a   j--) hit[j]++;.
31660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31670 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67    for(cnt=0, i=g
31680 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
31690 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c  r+1]); i>0 && i<
316a0 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e  usableSize && cn
316b0 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20  t<10000; .      
316c0 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20       cnt++){.   
316d0 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65     int size = ge
316e0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32  t2byte(&data[i+2
316f0 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ]);.      int j;
31700 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69  .      if( (i+si
31710 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a  ze-1)>=usableSiz
31720 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20  e || i<0 ){.    
31730 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31740 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a  sg(pCheck, 0,  .
31750 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72              "Cor
31760 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64  ruption detected
31770 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70   in cell %d on p
31780 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c  age %d",i,iPage,
31790 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
317a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69  .        for(j=i
317b0 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a  +size-1; j>=i; j
317c0 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20  --) hit[j]++;.  
317d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
317e0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
317f0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ]);.    }.    fo
31800 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61  r(i=cnt=0; i<usa
31810 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  bleSize; i++){. 
31820 20 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d       if( hit[i]=
31830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e  =0 ){.        cn
31840 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
31850 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b   if( hit[i]>1 ){
31860 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
31870 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31880 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75  0,.          "Mu
31890 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20  ltiple uses for 
318a0 62 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20  byte %d of page 
318b0 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a  %d", i, iPage);.
318c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
318d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
318e0 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68   if( cnt!=data[h
318f0 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63  dr+7] ){.      c
31900 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31910 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
31920 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20      "Fragmented 
31930 73 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65  space is %d byte
31940 20 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20   reported as %d 
31950 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20  on page %d",.   
31960 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61         cnt, data
31970 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b  [hdr+7], iPage);
31980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
31990 69 74 65 33 5f 66 72 65 65 28 68 69 74 29 3b 0a  ite3_free(hit);.
319a0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
319b0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
319c0 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69  depth+1;.}.#endi
319d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
319e0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
319f0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
31a00 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
31a10 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54  TY_CHECK./*.** T
31a20 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
31a30 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63   a complete chec
31a40 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42  k of the given B
31a50 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f  Tree file.  aRoo
31a60 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72  t[] is.** an arr
31a70 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62  ay of pages numb
31a80 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61  ers were each pa
31a90 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  ge number is the
31aa0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a   root page of.**
31ab0 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74   a table.  nRoot
31ac0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
31ad0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
31ae0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ot..**.** If eve
31af0 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f  rything checks o
31b00 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ut, this routine
31b10 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20   returns NULL.  
31b20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a  If something is.
31b30 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72  ** amiss, an err
31b40 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
31b50 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
31b60 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
31b70 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20  malloc().** and 
31b80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
31b90 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  t error message 
31ba0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  is returned.  Th
31bb0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
31bc0 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
31bd0 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
31be0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
31bf0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
31c00 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ne..*/.char *sql
31c10 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69  ite3BtreeIntegri
31c20 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65  tyCheck(.  Btree
31c30 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20   *p,     /* The 
31c40 62 74 72 65 65 20 74 6f 20 62 65 20 63 68 65 63  btree to be chec
31c50 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ked */.  int *aR
31c60 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72  oot,   /* An arr
31c70 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ay of root pages
31c80 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64   numbers for ind
31c90 69 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f  ividual trees */
31ca0 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20  .  int nRoot,   
31cb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
31cc0 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d  tries in aRoot[]
31cd0 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c   */.  int mxErr,
31ce0 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f      /* Stop repo
31cf0 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74  rting errors aft
31d00 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a  er this many */.
31d10 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20    int *pnErr    
31d20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20  /* Write number 
31d30 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74  of errors seen t
31d40 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  o this variable 
31d50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
31d60 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74   int nRef;.  Int
31d70 65 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b  egrityCk sCheck;
31d80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31d90 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
31da0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
31db0 70 29 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  p);.  nRef = sql
31dc0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
31dd0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
31de0 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
31df0 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
31e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
31e10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
31e20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
31e30 71 6c 69 74 65 33 53 74 72 44 75 70 28 22 55 6e  qlite3StrDup("Un
31e40 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20  able to acquire 
31e50 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
31e60 68 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  he database");. 
31e70 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20   }.  sCheck.pBt 
31e80 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e  = pBt;.  sCheck.
31e90 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
31ea0 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e  ager;.  sCheck.n
31eb0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
31ec0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68  gerPagecount(sCh
31ed0 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73  eck.pPager);.  s
31ee0 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78  Check.mxErr = mx
31ef0 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45  Err;.  sCheck.nE
31f00 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72  rr = 0;.  *pnErr
31f10 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
31f20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31f30 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
31f40 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
31f50 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
31f60 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d  pBt->nTrunc;.  }
31f70 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43  .#endif.  if( sC
31f80 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
31f90 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
31fa0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
31fb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
31fc0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
31fd0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
31fe0 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
31ff0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73 43 68  te3_malloc( (sCh
32000 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a  eck.nPage+1)*siz
32010 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  eof(sCheck.anRef
32020 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73  [0]) );.  if( !s
32030 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20  Check.anRef ){. 
32040 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
32050 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
32060 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20   *pnErr = 1;.   
32070 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
32080 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
32090 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  n sqlite3MPrintf
320a0 28 70 2d 3e 70 53 71 6c 69 74 65 2c 20 22 55 6e  (p->pSqlite, "Un
320b0 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25  able to malloc %
320c0 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20  d bytes", .     
320d0 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65     (sCheck.nPage
320e0 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
320f0 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20  k.anRef[0]));.  
32100 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  }.  for(i=0; i<=
32110 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b  sCheck.nPage; i+
32120 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  +){ sCheck.anRef
32130 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d  [i] = 0; }.  i =
32140 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
32150 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69  GE(pBt);.  if( i
32160 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29  <=sCheck.nPage )
32170 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52  {.    sCheck.anR
32180 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  ef[i] = 1;.  }. 
32190 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20   sCheck.zErrMsg 
321a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
321b0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
321c0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
321d0 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
321e0 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
321f0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
32200 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
32210 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
32220 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
32230 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
32240 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
32250 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
32260 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
32270 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
32280 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e  nRoot && sCheck.
32290 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
322a0 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
322b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
322c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
322d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
322e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
322f0 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
32300 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
32310 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
32320 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
32330 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
32340 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32350 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
32360 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
32370 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
32380 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
32390 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
323a0 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
323b0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
323c0 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
323d0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
323e0 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
323f0 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
32400 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
32410 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32420 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
32430 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
32440 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32450 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
32460 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
32470 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
32480 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
32490 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
324a0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
324b0 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
324c0 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
324d0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
324e0 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
324f0 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
32500 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
32510 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
32520 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
32530 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
32540 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
32550 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
32560 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
32570 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
32580 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
32590 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
325a0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
325b0 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
325c0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
325d0 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
325e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
325f0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
32600 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
32610 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
32620 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
32630 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
32640 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
32650 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
32660 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
32670 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
32680 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
32690 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
326a0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
326b0 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
326c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
326d0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
326e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
326f0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
32700 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
32710 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
32720 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
32730 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
32740 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
32750 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
32760 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
32770 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
32780 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
32790 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
327a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
327b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
327c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
327d0 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a  heck.anRef);.  *
327e0 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e  pnErr = sCheck.n
327f0 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 43  Err;.  return sC
32800 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a  heck.zErrMsg;.}.
32810 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
32820 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
32830 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CHECK */../*.** 
32840 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
32850 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
32860 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
32870 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
32880 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61  The pager filena
32890 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
328a0 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
328b0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
328c0 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
328d0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
328e0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
328f0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
32900 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
32910 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65  etFilename(Btree
32920 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
32930 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
32940 30 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74  0 );.  /* assert
32950 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
32960 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 20 2a  ldsMutex(p) ); *
32970 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
32980 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
32990 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
329a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
329b0 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
329c0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
329d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
329e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
329f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
32a00 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69  directory name i
32a10 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
32a20 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
32a30 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
32a40 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
32a50 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
32a60 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
32a70 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
32a80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69  qlite3BtreeGetDi
32a90 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  rname(Btree *p){
32aa0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
32ab0 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
32ac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32ad0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
32ae0 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  (p) );.  return 
32af0 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
32b00 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
32b10 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
32b20 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
32b30 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
32b40 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64   file for this d
32b50 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74  atabase. The ret
32b60 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
32b70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32b80 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c  the same regardl
32b90 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
32ba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
32bb0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
32bc0 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ted or not..**.*
32bd0 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72  * The pager jour
32be0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
32bf0 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
32c00 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
32c10 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
32c20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
32c30 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
32c40 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
32c50 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
32c60 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
32c70 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  nalname(Btree *p
32c80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
32c90 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
32ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
32cb0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
32cc0 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72  ex(p) );.  retur
32cd0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  n sqlite3PagerJo
32ce0 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74  urnalname(p->pBt
32cf0 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
32d00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32d10 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  T_VACUUM./*.** C
32d20 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  opy the complete
32d30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46   content of pBtF
32d40 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20  rom into pBtTo. 
32d50 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   A transaction.*
32d60 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  * must be active
32d70 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e   for both files.
32d80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
32d90 6f 66 20 66 69 6c 65 20 70 42 74 46 72 6f 6d 20  of file pBtFrom 
32da0 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62  may be reduced b
32db0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
32dc0 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  ..** If anything
32dd0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65   goes wrong, the
32de0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
32df0 70 42 74 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65  pBtFrom is rolle
32e00 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
32e10 63 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46  c int btreeCopyF
32e20 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
32e30 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
32e40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32e50 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e  _OK;.  Pgno i, n
32e60 50 61 67 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69  Page, nToPage, i
32e70 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68 61 72 65  Skip;..  BtShare
32e80 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e  d *pBtTo = pTo->
32e90 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pBt;.  BtShared 
32ea0 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  *pBtFrom = pFrom
32eb0 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 54  ->pBt;..  if( pT
32ec0 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
32ed0 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
32ee0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
32ef0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
32f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
32f10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
32f20 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 20 72 65  To->pCursor ) re
32f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
32f40 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 73 71  ;.  nToPage = sq
32f50 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
32f60 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  unt(pBtTo->pPage
32f70 72 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71  r);.  nPage = sq
32f80 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
32f90 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  unt(pBtFrom->pPa
32fa0 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20  ger);.  iSkip = 
32fb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
32fc0 45 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28  E(pBtTo);.  for(
32fd0 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
32fe0 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20  OK && i<=nPage; 
32ff0 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65  i++){.    DbPage
33000 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69   *pDbPage;.    i
33010 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f  f( i==iSkip ) co
33020 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
33030 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33040 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
33050 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , i, &pDbPage);.
33060 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
33070 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ak;.    rc = sql
33080 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
33090 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  te(pBtTo->pPager
330a0 2c 20 69 2c 20 73 71 6c 69 74 65 33 50 61 67 65  , i, sqlite3Page
330b0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
330c0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
330d0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
330e0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
330f0 20 74 68 65 20 66 69 6c 65 20 69 73 20 73 68 72   the file is shr
33100 69 6e 6b 69 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20  inking, journal 
33110 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 61  the pages that a
33120 72 65 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  re being truncat
33130 65 64 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  ed.  ** so that 
33140 74 68 65 79 20 63 61 6e 20 62 65 20 72 6f 6c 6c  they can be roll
33150 65 64 20 62 61 63 6b 20 69 66 20 74 68 65 20 63  ed back if the c
33160 6f 6d 6d 69 74 20 66 61 69 6c 73 2e 0a 20 20 2a  ommit fails..  *
33170 2f 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b  /.  for(i=nPage+
33180 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
33190 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20   && i<=nToPage; 
331a0 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65  i++){.    DbPage
331b0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69   *pDbPage;.    i
331c0 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f  f( i==iSkip ) co
331d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
331e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
331f0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
33200 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
33210 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
33220 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33230 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
33240 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
33250 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
33260 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 2f  (pDbPage);.    /
33270 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d  * Yeah.  It seem
33280 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20  s wierd to call 
33290 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68  DontWrite() righ
332a0 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e  t after Write().
332b0 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68 61    But.    ** tha
332c0 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  t is because the
332d0 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20   names of those 
332e0 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f  procedures do no
332f0 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 2a  t exactly .    *
33300 2a 20 72 65 70 72 65 73 65 6e 74 20 77 68 61 74  * represent what
33310 20 74 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65   they do.  Write
33320 28 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20  () really means 
33330 22 70 75 74 20 74 68 69 73 20 70 61 67 65 20 69  "put this page i
33340 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6c  n the.    ** rol
33350 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
33360 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72  d mark it as dir
33370 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ty so that it wi
33380 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
33390 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
333a0 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e  base file later.
333b0 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75  "  DontWrite() u
333c0 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64  ndoes the second
333d0 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20   part of.    ** 
333e0 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74  that and prevent
333f0 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  s the page from 
33400 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  being written to
33410 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
33420 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
33430 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  is still on the 
33440 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
33450 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74  , though.  And t
33460 68 61 74 20 69 73 20 74 68 65 20 77 68 6f 6c 65  hat is the whole
33470 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6f 66  .    ** point of
33480 20 74 68 69 73 20 6c 6f 6f 70 3a 20 74 6f 20 70   this loop: to p
33490 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  ut pages on the 
334a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
334b0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
334c0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
334d0 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ge);.  }.  if( !
334e0 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50  rc && nPage<nToP
334f0 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  age ){.    rc = 
33500 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
33510 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  cate(pBtTo->pPag
33520 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  er, nPage);.  }.
33530 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
33540 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
33550 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a  lback(pTo);.  }.
33560 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
33570 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33580 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20  eCopyFile(Btree 
33590 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72  *pTo, Btree *pFr
335a0 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  om){.  int rc;. 
335b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
335c0 65 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74  er(pTo);.  sqlit
335d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 46 72  e3BtreeEnter(pFr
335e0 6f 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  om);.  rc = btre
335f0 65 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70  eCopyFile(pTo, p
33600 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  From);.  sqlite3
33610 42 74 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d  BtreeLeave(pFrom
33620 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33630 65 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72  eLeave(pTo);.  r
33640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
33650 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
33660 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a  IT_VACUUM */../*
33670 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
33680 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63  ero if a transac
33690 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
336a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
336b0 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72  reeIsInTrans(Btr
336c0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
336d0 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ( p==0 || sqlite
336e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
336f0 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
33700 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
33710 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
33720 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
33730 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
33740 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
33750 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
33760 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
33770 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33780 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
33790 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
337a0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
337b0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
337c0 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70  urn (p->pBt && p
337d0 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a  ->pBt->inStmt);.
337e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
337f0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65  non-zero if a re
33800 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72  ad (or write) tr
33810 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
33820 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
33830 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
33840 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
33850 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33860 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
33870 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
33880 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
33890 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
338a0 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
338b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
338c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
338d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62  ointer to a blob
338e0 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
338f0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  iated with.** a 
33900 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74  single shared-bt
33910 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  ree. The memory 
33920 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e  is used by clien
33930 74 20 63 6f 64 65 20 66 6f 72 20 69 74 27 73 20  t code for it's 
33940 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20  own.** purposes 
33950 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f  (for example, to
33960 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65   store a high-le
33970 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63  vel schema assoc
33980 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
33990 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29  he shared-btree)
339a0 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65  . The btree laye
339b0 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65  r manages refere
339c0 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73  nce counting iss
339d0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ues..**.** The f
339e0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69  irst time this i
339f0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68  s called on a sh
33a00 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74  ared-btree, nByt
33a10 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  es bytes of memo
33a20 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61  ry.** are alloca
33a30 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64  ted, zeroed, and
33a40 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
33a50 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63   caller. For eac
33a60 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a  h subsequent .**
33a70 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73   call the nBytes
33a80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
33a90 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e  nored and a poin
33aa0 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ter to the same 
33ab0 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72  blob.** of memor
33ac0 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a  y returned. .**.
33ad0 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74  ** Just before t
33ae0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
33af0 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66  is closed, the f
33b00 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61  unction passed a
33b10 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20  s the .** xFree 
33b20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68  argument when th
33b30 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
33b40 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20  ion was made is 
33b50 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a  invoked on the .
33b60 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63  ** blob of alloc
33b70 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69  ated memory. Thi
33b80 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
33b90 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74  d not call sqlit
33ba0 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20  e3_free().** on 
33bb0 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20  the memory, the 
33bc0 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73  btree layer does
33bd0 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   that..*/.void *
33be0 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
33bf0 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ma(Btree *p, int
33c00 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78   nBytes, void(*x
33c10 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a  Free)(void *)){.
33c20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33c30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
33c40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
33c50 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53  ;.  if( !pBt->pS
33c60 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74  chema ){.    pBt
33c70 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ->pSchema = sqli
33c80 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42  te3MallocZero(nB
33c90 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ytes);.    pBt->
33ca0 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46  xFreeSchema = xF
33cb0 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ree;.  }.  sqlit
33cc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
33cd0 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70  .  return pBt->p
33ce0 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Schema;.}../*.**
33cf0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
33d00 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20  another user of 
33d10 74 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20  the same shared 
33d20 62 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67  btree as the arg
33d30 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20  ument.** handle 
33d40 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
33d50 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  ve lock on the s
33d60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
33d70 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
33d80 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63  e3BtreeSchemaLoc
33d90 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ked(Btree *p){. 
33da0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
33db0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
33dc0 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  _held(p->pSqlite
33dd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
33de0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
33df0 70 29 3b 0a 20 20 72 63 20 3d 20 28 71 75 65 72  p);.  rc = (quer
33e00 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  yTableLock(p, MA
33e10 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
33e20 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)!=SQLITE_OK
33e30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33e40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
33e50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e  urn rc;.}...#ifn
33e60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33e70 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
33e80 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ** Obtain a lock
33e90 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68   on the table wh
33ea0 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ose root page is
33eb0 20 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c   iTab.  The.** l
33ec0 6f 63 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c  ock is a write l
33ed0 6f 63 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f  ock if isWritelo
33ee0 63 6b 20 69 73 20 74 72 75 65 20 6f 72 20 61 20  ck is true or a 
33ef0 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20  read lock.** if 
33f00 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  it is false..*/.
33f10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33f20 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  LockTable(Btree 
33f30 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38  *p, int iTab, u8
33f40 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20   isWriteLock){. 
33f50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33f60 5f 4f 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79  _OK;.  u8 lockTy
33f70 70 65 20 3d 20 28 69 73 57 72 69 74 65 4c 6f 63  pe = (isWriteLoc
33f80 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41  k?WRITE_LOCK:REA
33f90 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  D_LOCK);.  sqlit
33fa0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
33fb0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62  .  rc = queryTab
33fc0 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20  leLock(p, iTab, 
33fd0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69 66 28  lockType);.  if(
33fe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33ff0 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54  {.    rc = lockT
34000 61 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f  able(p, iTab, lo
34010 63 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  ckType);.  }.  s
34020 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34030 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
34040 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
34050 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34060 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41  INCRBLOB./*.** A
34070 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75 73  rgument pCsr mus
34080 74 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f 70  t be a cursor op
34090 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
340a0 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45   on an .** INTKE
340b0 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  Y table currentl
340c0 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  y pointing at a 
340d0 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74 72  valid table entr
340e0 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  y. .** This func
340f0 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68  tion modifies th
34100 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 61 73  e data stored as
34110 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 65 6e   part of that en
34120 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  try..** Only the
34130 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61   data content ma
34140 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69  y only be modifi
34150 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ed, it is not po
34160 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61  ssible.** to cha
34170 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  nge the length o
34180 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65  f the data store
34190 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
341a0 33 42 74 72 65 65 50 75 74 44 61 74 61 28 42 74  3BtreePutData(Bt
341b0 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75 33  Cursor *pCsr, u3
341c0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
341d0 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61  t, void *z){.  a
341e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
341f0 64 73 4d 75 74 65 78 28 70 43 73 72 29 20 29 3b  dsMutex(pCsr) );
34200 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34210 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
34220 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  sr->pBtree->pSql
34230 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
34240 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69 73   assert(pCsr->is
34250 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
34260 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74  .  if( pCsr->eSt
34270 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate==CURSOR_REQU
34280 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 72  IRESEEK ){.    r
34290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
342a0 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  RT;.  }..  /* Ch
342b0 65 63 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64  eck some precond
342c0 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20  itions: .  **   
342d0 28 61 29 20 74 68 65 20 63 75 72 73 6f 72 20 69  (a) the cursor i
342e0 73 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  s open for writi
342f0 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74  ng,.  **   (b) t
34300 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d  here is no read-
34310 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
34320 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  e being modified
34330 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
34340 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
34350 73 20 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77  s at a valid row
34360 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   of an intKey ta
34370 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
34380 21 70 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCsr->wrFlag ){
34390 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
343a0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
343b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 73 72  .  assert( !pCsr
343c0 2d 3e 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ->pBt->readOnly 
343d0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 43  .          && pC
343e0 73 72 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  sr->pBt->inTrans
343f0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
34400 49 54 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65  ITE );.  if( che
34410 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72  ckReadLocks(pCsr
34420 2d 3e 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e  ->pBtree, pCsr->
34430 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20  pgnoRoot, pCsr) 
34440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
34450 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
34460 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
34470 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
34480 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
34490 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
344a0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
344b0 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61  ID || !pCsr->pPa
344c0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
344d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
344e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
344f0 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
34500 61 64 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c  ad(pCsr, offset,
34510 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
34520 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b  char *)z, 0, 1);
34530 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61  .}../* .** Set a
34540 20 66 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75   flag on this cu
34550 72 73 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68  rsor to cache th
34560 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70  e locations of p
34570 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a  ages from the .*
34580 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  * overflow list 
34590 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
345a0 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73 65  row. This is use
345b0 64 20 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65  d by cursors ope
345c0 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65  ned.** for incre
345d0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f  mental blob IO o
345e0 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nly..**.** This 
345f0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20  function sets a 
34600 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61  flag only. The a
34610 63 74 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74  ctual page locat
34620 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74  ion cache.** (st
34630 6f 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72  ored in BtCursor
34640 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73  .aOverflow[]) is
34650 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75   allocated and u
34660 73 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a  sed by function.
34670 2a 2a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  ** accessPayload
34680 28 29 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66  () (the worker f
34690 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69  unction for sqli
346a0 74 65 33 42 74 72 65 65 44 61 74 61 28 29 20 61  te3BtreeData() a
346b0 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  nd.** sqlite3Btr
346c0 65 65 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f  eePutData())..*/
346d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
346e0 65 65 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28  eeCacheOverflow(
346f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
34700 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
34710 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
34720 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
34730 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34740 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
34750 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
34760 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75  );.  assert(!pCu
34770 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
34780 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 21  dle);.  assert(!
34790 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
347a0 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  ;.  pCur->isIncr
347b0 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a  blobHandle = 1;.
347c0 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.