/ Hex Artifact Content
Login

Artifact 850cd5de860e01233153ade9b24ffc775a794e8e:


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 33 20 32 30 30 37 2f 30  c,v 1.413 2007/0
0190: 38 2f 32 38 20 30 32 3a 32 37 3a 35 32 20 64 72  8/28 02:27:52 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 4d 75 74   sqlite3BtreeMut
0bb0: 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  exHeld(pBt->mute
0bc0: 78 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  x) );.  .  /* Th
0bd0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
0be0: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
0bf0: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
0c00: 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   */.  if( !p->sh
0c10: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  arable ){.    re
0c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0c30: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
0c40: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
0c50: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
0c60: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0c70: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
0c80: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
0c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
0ca0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
0cb0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
0cc0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
0cd0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
0ce0: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
0cf0: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
0d00: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
0d10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
0d20: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
0d30: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0d40: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0d50: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
0d60: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
0d70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
0d80: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
0d90: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
0da0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
0db0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
0dc0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0dd0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
0de0: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
0df0: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
0e00: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
0e10: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
0e20: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
0e30: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
0e40: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0e50: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
0e60: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
0e70: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
0e80: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
0e90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
0ea0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
0eb0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
0ec0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
0ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
0ee0: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
0ef0: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
0f00: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
0f10: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0f20: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0f30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0f40: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
0f50: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
0f60: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
0f70: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
0f80: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
0f90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
0fa0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
0fb0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
0fc0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
0fd0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
0fe0: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
0ff0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
1000: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1010: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
1020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1040: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1050: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1060: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1080: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1090: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
10a0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
10b0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
10c0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
10d0: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
10e0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
10f0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
1100: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
1110: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
1120: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
1130: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1140: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
1150: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
1160: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
1170: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
1180: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
1190: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
11a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
11b0: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
11c0: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
11d0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
11e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11f0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
1200: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
1210: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1220: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1230: 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e  eMutexHeld(pBt->
1240: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1250: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1260: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1270: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1280: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1290: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
12a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12b0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
12d0: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
12e0: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
12f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
1300: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1310: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
1320: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
1330: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
1340: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
1350: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1360: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1370: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1380: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1390: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
13a0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
13b0: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
13c0: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
13d0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
13e0: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
13f0: 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74   .    (p->pSqlit
1400: 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e 70  e) && .    (p->p
1410: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
1420: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1430: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
1440: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
1450: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1460: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1470: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1480: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1490: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
14a0: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
14b0: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
14c0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
14d0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
14e0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
14f0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1500: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
1510: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1520: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
1530: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
1540: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
1550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1560: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1570: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1580: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
1590: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
15a0: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
15b0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
15c0: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
15d0: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
15e0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
15f0: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
1600: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
1610: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
1620: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1630: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
1640: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1660: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1670: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1680: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
1690: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
16a0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
16b0: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16c0: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
16d0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
16e0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
16f0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
1700: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1710: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
1720: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
1730: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
1740: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
1750: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1760: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1770: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1780: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
1790: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
17a0: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
17b0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
17c0: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
17d0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
17e0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
17f0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
1800: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
1810: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
1820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
1840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1880: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
1890: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
18a0: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
18b0: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
18c0: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
18d0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
18e0: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
18f0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
1900: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
1910: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
1920: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
1930: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1940: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1950: 65 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e 70 42  eMutexHeld(p->pB
1960: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1970: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
1980: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
1990: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
19a0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
19b0: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
19c0: 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  Iter;.    if( pL
19d0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
19e0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
19f0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
1a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1a10: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
1a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74  else{.      ppIt
1a30: 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65  er = &pLock->pNe
1a40: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
1a50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a60: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1a70: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
1a80: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
1a90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
1aa0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
1ab0: 72 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  rence */..#ifnde
1ac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1ad0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76  CRBLOB./*.** Inv
1ae0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
1af0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1b00: 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20  ache for cursor 
1b10: 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  pCur, if any..*/
1b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
1b30: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1b40: 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ache(BtCursor *p
1b50: 43 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Cur){.  sqlite3_
1b60: 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
1b70: 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61  flow);.  pCur->a
1b80: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a  Overflow = 0;.}.
1b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
1ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1bb0: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
1bc0: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  or all cursors o
1bd0: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  pened.** on the 
1be0: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
1bf0: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73  ucture pBt..*/.s
1c00: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
1c10: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1c20: 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a  Cache(BtShared *
1c30: 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
1c40: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
1c50: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
1c60: 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  Held(pBt->mutex)
1c70: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
1c80: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1c90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1ca0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1cb0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
1cc0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
1cd0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1ce0: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
1cf0: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
1d00: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1d10: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
1d20: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
1d30: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
1d40: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
1d50: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
1d60: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
1d70: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
1d80: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
1d90: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
1da0: 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74  IRESEEK..*/.stat
1db0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
1dc0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
1dd0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
1de0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1df0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
1e00: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
1e10: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
1e20: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
1e30: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
1e40: 75 74 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70  utexHeld(pCur->p
1e50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  Btree->pBt->mute
1e60: 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  x) );..  rc = sq
1e70: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1e80: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
1e90: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
1ea0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
1eb0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
1ec0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
1ed0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
1ee0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
1ef0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
1f00: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
1f10: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
1f20: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
1f30: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
1f40: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
1f50: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
1f60: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
1f70: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
1f80: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
1f90: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
1fa0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
1fb0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
1fc0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1fd0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
1fe0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1ff0: 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  y){.    void *pK
2000: 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ey = sqlite3_mal
2010: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
2020: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
2030: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2040: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
2050: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2060: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
2070: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2090: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
20a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20c0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
20d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
20f0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
2100: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50  ssert( !pCur->pP
2110: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  age->intKey || !
2120: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
2130: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2140: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
2150: 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
2160: 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
2170: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2180: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2190: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
21a0: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
21b0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
21c0: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
21d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
21e0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
21f0: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
2200: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
2210: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
2220: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
2230: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
2240: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
2250: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
2260: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
2270: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2280: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2290: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
22a0: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
22b0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
22c0: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
22d0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
22e0: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
22f0: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
2300: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
2310: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
2320: 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74  texHeld(pBt->mut
2330: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
2340: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2350: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2360: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
2370: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
2380: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
2390: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
23a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
23b0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
23c0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
23d0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
23e0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
23f0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
2400: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2420: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2430: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
2440: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
2450: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2470: 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
2480: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2490: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
24a0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
24b0: 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  Held(pCur->pBtre
24c0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
24d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
24e0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
24f0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2500: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2510: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
2530: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2540: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
2550: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
2560: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
2570: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
2580: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2590: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
25a0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
25b0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
25c0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
25d0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
25e0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
25f0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
2600: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
2610: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
2620: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2630: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
2640: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
2650: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2660: 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ion()..**.** If 
2670: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2680: 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64  ent argument - d
2690: 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65  oSeek - is false
26a0: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f  , then instead o
26b0: 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  f .** returning 
26c0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
26d0: 27 73 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  's saved positio
26e0: 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73  n, any saved pos
26f0: 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ition is deleted
2700: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73  .** and the curs
2710: 6f 72 20 73 74 61 74 65 20 73 65 74 20 74 6f 20  or state set to 
2720: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a  CURSOR_INVALID..
2730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2740: 72 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61  reeRestoreOrClea
2750: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2760: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2770: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2780: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2790: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
27a0: 45 53 45 45 4b 20 29 3b 0a 23 69 66 6e 64 65 66  ESEEK );.#ifndef
27b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
27c0: 52 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72  RBLOB.  if( pCur
27d0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
27e0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
27f0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
2800: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72   }.#endif.  pCur
2810: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2820: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
2830: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2840: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
2850: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
2860: 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69  y, 0, &pCur->ski
2870: 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
2880: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2890: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
28a0: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
28b0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
28c0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28d0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28e0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
28f0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2900: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
2910: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
2920: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
2930: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2940: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
2950: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
2960: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
2970: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2980: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2990: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
29a0: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
29b0: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
29c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
29e0: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
29f0: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
2a00: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
2a10: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
2a20: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
2a30: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
2a40: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2a50: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
2a60: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
2a70: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2a80: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
2a90: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
2aa0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
2ab0: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
2ac0: 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65  age, iPtrMap, re
2ad0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2ae0: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
2af0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2b00: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
2b10: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
2b20: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2b30: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
2b40: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
2b50: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
2b60: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2b70: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2b80: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2b90: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ba0: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2bb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
2bd0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
2be0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
2bf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2c00: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
2c10: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
2c20: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2c30: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
2c40: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
2c50: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
2c60: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
2c70: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
2c80: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2c90: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
2ca0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
2cb0: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
2cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cd0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
2ce0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
2cf0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
2d00: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
2d10: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
2d20: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2d30: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
2d40: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
2d50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2d60: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
2d70: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
2d80: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2d90: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2da0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
2db0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
2dc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
2dd0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
2de0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2df0: 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
2e00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2e10: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
2e20: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
2e30: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
2e40: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
2e50: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
2e60: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
2e70: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
2e80: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2e90: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
2ea0: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2eb0: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
2ec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2ee0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74  _BKPT;.  }.  iPt
2ef0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
2f00: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
2f10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f20: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
2f30: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
2f40: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2f50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f60: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f70: 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  }.  offset = PTR
2f80: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
2f90: 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d  t, key);.  pPtrm
2fa0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
2fb0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
2fc0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
2fd0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
2fe0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
2ff0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
3000: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
3010: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
3020: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
3030: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
3040: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
3050: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
3060: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
3070: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
3080: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3090: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
30a0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
30b0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
30d0: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
30e0: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
30f0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
3100: 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
3110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
3120: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
3130: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
3140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3150: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
3160: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
3170: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
3180: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
3190: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
31a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
31b0: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
31c0: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
31d0: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
31e0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
31f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
3200: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
3210: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
3220: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
3230: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
3240: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
3250: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
3260: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
3270: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
3280: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
3290: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
32a0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
32b0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
32c0: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
32d0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
32e0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
32f0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
3300: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
3310: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
3320: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
3330: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
3340: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3350: 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
3360: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3370: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
3380: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
3390: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
33a0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
33b0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
33c0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
33d0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
33e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
33f0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
3400: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3410: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
3420: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3430: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
3440: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3450: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
3460: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
3470: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
3480: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
3490: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
34a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
34b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
34c0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
34d0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
34e0: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
34f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3500: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3520: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3530: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
3540: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
3550: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
3560: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
3570: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
3580: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
3590: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
35a0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
35b0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
35c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
35d0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
35e0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
35f0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3600: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
3610: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
3620: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3630: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
3640: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3650: 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61 67 65  ell) \.  ((pPage
3660: 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74 32 62  )->aData + get2b
3670: 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e 61 44  yte(&(pPage)->aD
3680: 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63 65 6c  ata[(pPage)->cel
3690: 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65 6c 6c  lOffset+2*(iCell
36a0: 29 5d 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  )])).#ifdef SQLI
36b0: 54 45 5f 54 45 53 54 0a 75 38 20 2a 73 71 6c 69  TE_TEST.u8 *sqli
36c0: 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
36d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
36e0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61   int iCell){.  a
36f0: 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20  ssert( iCell>=0 
3700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  );.  assert( iCe
3710: 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 70 50 61  ll<get2byte(&pPa
3720: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
3730: 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29  >hdrOffset+3]) )
3740: 3b 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  ;.  return findC
3750: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
3760: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3770: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
3780: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
3790: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  f sqlite3BtreeFi
37a0: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
37b0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
37c0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
37d0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
37e0: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
37f0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
3800: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3810: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3820: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3830: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3840: 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
3850: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
3860: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
3870: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3880: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3890: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
38a0: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
38b0: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
38c0: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
38d0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
38e0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
38f0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
3900: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
3910: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3920: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3940: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3950: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
3960: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
3970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3980: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
3990: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
39a0: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
39b0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
39c0: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
39d0: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
39e0: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
39f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
3a00: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
3a10: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
3a20: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
3a30: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
3a40: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
3a50: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
3a60: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
3a70: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
3a80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
3a90: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
3aa0: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
3ab0: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
3ac0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
3ad0: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
3ae0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3af0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
3b00: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
3b10: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
3b20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3b30: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
3b40: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
3b50: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
3b60: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
3b70: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
3b80: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
3b90: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ba0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
3bb0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
3bc0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
3bd0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
3be0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
3bf0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
3c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3c10: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
3c20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
3c30: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
3c40: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
3c50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3c60: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
3c70: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
3c80: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
3c90: 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  xHeld(pPage->pBt
3ca0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
3cb0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
3cc0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
3cd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
3ce0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
3cf0: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
3d00: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
3d10: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
3d20: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
3d30: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
3d40: 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67  ta ){.    n += g
3d50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
3d60: 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29  l[n], &nPayload)
3d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3d80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d  Payload = 0;.  }
3d90: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20  .  pInfo->nData 
3da0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66  = nPayload;.  if
3db0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
3dc0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3dd0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
3de0: 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e   (u64 *)&pInfo->
3df0: 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
3e00: 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e      u32 x;.    n
3e10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3e20: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a  &pCell[n], &x);.
3e30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
3e40: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
3e50: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
3e60: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
3e70: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
3e80: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
3e90: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
3ea0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
3eb0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
3ec0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
3ed0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
3ee0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
3ef0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
3f00: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
3f10: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
3f20: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
3f30: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
3f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3f50: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
3f60: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
3f70: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
3f80: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
3f90: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
3fa0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
3fb0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
3fc0: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
3fd0: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
3fe0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
3ff0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
4000: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
4010: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4020: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4030: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4040: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4050: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4060: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4070: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4080: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4090: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
40a0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
40b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
40c0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
40d0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
40e0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
40f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
4100: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
4110: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4120: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4130: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4140: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4150: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4160: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4170: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4180: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4190: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
41a0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
41b0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
41c0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
41d0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
41e0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
41f0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
4200: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
4210: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4220: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4230: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4240: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4250: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4260: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4270: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4280: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4290: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
42a0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
42b0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
42c0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
42d0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
42e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
42f0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
4300: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
4310: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4320: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4330: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4340: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4350: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4360: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4370: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4380: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4390: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
43a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
43b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
43c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
43d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
43e0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
43f0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
4400: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
4410: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4420: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4430: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4440: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4450: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4460: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4470: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4480: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4490: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
44a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
44b0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
44c0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
44d0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
44e0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
44f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4510: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4520: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4530: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4540: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4550: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4560: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4570: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4580: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4590: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
45a0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
45b0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
45c0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
45d0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
45e0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
45f0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4600: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4610: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4620: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4630: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4640: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4650: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4660: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4670: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4680: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4690: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
46a0: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  int cellSize(Mem
46b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
46c0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
46d0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
46e0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
46f0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4700: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4710: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4720: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
4730: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4740: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4750: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4760: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4770: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4780: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4790: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
47a0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
47b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
47c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
47d0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
47e0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
47f0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4800: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4810: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4820: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4830: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4840: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4850: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4860: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4870: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4880: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4890: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
48a0: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
48b0: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
48c0: 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nfo;.    sqlite3
48d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
48e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
48f0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
4900: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4910: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4920: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4930: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4940: 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
4950: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4960: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4970: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4980: 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
4990: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
49a0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
49b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
49c0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
49d0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
49e0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
49f0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
4a00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4a10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4a20: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
4a30: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
4a40: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
4a50: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4a60: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4a70: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4a80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4a90: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4aa0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4ab0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4ac0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4ad0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
4ae0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
4af0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
4b00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4b10: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  eeMutexHeld(pPag
4b20: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
4b30: 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
4b40: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
4b50: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65  ge, iCell);.  re
4b60: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76  turn ptrmapPutOv
4b70: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
4b80: 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ll);.}.#endif...
4b90: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
4ba0: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
4bb0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
4bc0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
4bd0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
4be0: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
4bf0: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
4c00: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
4c10: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
4c20: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
4c30: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
4c40: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
4c50: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
4c60: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
4c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
4c80: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
4c90: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
4ca0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
4cc0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
4cd0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
4ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4cf0: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
4d00: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
4d10: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4d20: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
4d30: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
4d40: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
4d50: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
4d60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4d70: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
4d80: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
4d90: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
4dc0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
4dd0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
4de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4df0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
4e00: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
4e10: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
4e20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
4e30: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
4e40: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
4e50: 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4e70: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
4e80: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
4e90: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4eb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
4ec0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
4ed0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4ee0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
4ef0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
4f00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
4f10: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
4f20: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
4f30: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
4f40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4f50: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
4f60: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
4f70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
4f80: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
4f90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4fa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
4fb0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
4fc0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
4fd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
4fe0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
4ff0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
5000: 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50  treeMutexHeld(pP
5010: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5020: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
5030: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61  ite3_malloc( pPa
5040: 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
5050: 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70 3d  e );.  if( temp=
5060: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5070: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74 61  TE_NOMEM;.  data
5080: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
5090: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
50a0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
50b0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
50c0: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
50d0: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
50e0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
50f0: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
5100: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
5110: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
5120: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5130: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
5140: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5150: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
5160: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
5170: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
5180: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
5190: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
51a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
51b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
51c0: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
51d0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
51e0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
51f0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
5200: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
5210: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
5220: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
5230: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
5240: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5250: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
5260: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
5270: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
5280: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
5290: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
52a0: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
52b0: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
52c0: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
52d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
52e0: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
52f0: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
5300: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
5310: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
5320: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
5330: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
5340: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
5350: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
5360: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
5370: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
5380: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
5390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 74    sqlite3_free(t
53a0: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  emp);.  return S
53b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
53c0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
53d0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
53e0: 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   on a page..**.*
53f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
5400: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
5410: 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69  Data[] of the fi
5420: 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  rst byte of.** t
5430: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
5440: 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69  n. Or return 0 i
5450: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  f there is not e
5460: 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70  nough free.** sp
5470: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
5480: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61  to satisfy the a
5490: 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73  llocation reques
54a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
54b0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42  page contains nB
54c0: 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61  ytes of free spa
54d0: 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ce but does not 
54e0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65  contain.** nByte
54f0: 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  s of contiguous 
5500: 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e  free space, then
5510: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75   this routine au
5520: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63  tomatically.** c
5530: 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74  alls defragement
5540: 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c  Page() to consol
5550: 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73  idate all free s
5560: 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20  pace before .** 
5570: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e  allocating the n
5580: 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61  ew chunk..*/.sta
5590: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
55a0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
55b0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29  Page, int nByte)
55c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63  {.  int addr, pc
55d0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a  , hdr;.  int siz
55e0: 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a  e;.  int nFrag;.
55f0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74    int top;.  int
5600: 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65   nCell;.  int ce
5610: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69  llOffset;.  unsi
5620: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
5630: 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61  .  .  data = pPa
5640: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
5650: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5660: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
5670: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
5680: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5690: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
56a0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
56b0: 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70  texHeld(pPage->p
56c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
56d0: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
56e0: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
56f0: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
5700: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
5710: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
5720: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
5730: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
5740: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
5750: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
5760: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
5770: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
5780: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
5790: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
57a0: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
57b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
57c0: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
57d0: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
57e0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
57f0: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
5800: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
5810: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
5820: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
5830: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
5840: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
5850: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
5860: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
5870: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
5880: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
5890: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
58a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
58b0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
58c0: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
58d0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
58e0: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
58f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5900: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
5910: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
5920: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
5930: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
5940: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
5950: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5960: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
5970: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
5980: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
5990: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
59a0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
59b0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
59c0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
59d0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
59e0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
59f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5a00: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
5a10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5a20: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
5a30: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
5a40: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
5a50: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
5a60: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
5a70: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
5a80: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
5a90: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
5aa0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
5ab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5ac0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
5ad0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
5ae0: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
5af0: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
5b00: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
5b10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
5b20: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
5b30: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
5b40: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
5b50: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
5b60: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
5b70: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
5b80: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
5b90: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
5ba0: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
5bb0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
5bc0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
5bd0: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
5be0: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
5bf0: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
5c00: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
5c10: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
5c20: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
5c30: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
5c40: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
5c50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
5c60: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
5c70: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
5c80: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
5c90: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
5ca0: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
5cb0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
5cc0: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
5cd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
5ce0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5cf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
5d00: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
5d10: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
5d20: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
5d30: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
5d40: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
5d50: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
5d60: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
5d70: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
5d80: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
5d90: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
5da0: 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
5db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5dc0: 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73 69   if( size<4 ) si
5dd0: 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66 20  ze = 4;..#ifdef 
5de0: 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
5df0: 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72  LETE.  /* Overwr
5e00: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
5e10: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
5e20: 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55  os when the SECU
5e30: 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20  RE_DELETE .  ** 
5e40: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
5e50: 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
5e60: 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64  e */.  memset(&d
5e70: 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73  ata[start], 0, s
5e80: 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
5e90: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
5ea0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
5eb0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
5ec0: 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64  eeblocks */.  hd
5ed0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
5ee0: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
5ef0: 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  dr + 1;.  while(
5f00: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
5f10: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5f20: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
5f30: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
5f40: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
5f50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5f60: 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  e-4 );.    asser
5f70: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
5f80: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  ;.    addr = pbe
5f90: 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gin;.  }.  asser
5fa0: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
5fb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5fc0: 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-4 );.  assert(
5fd0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
5fe0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
5ff0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
6000: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
6010: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
6020: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
6030: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6040: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
6050: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
6060: 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  += size;..  /* C
6070: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
6080: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
6090: 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e    addr = pPage->
60a0: 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20  hdrOffset + 1;. 
60b0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
60c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
60d0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
60e0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
60f0: 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
6100: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
6110: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
6120: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
6130: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
6140: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
6150: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6160: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
6170: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6180: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
6190: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
61a0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
61b0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
61c0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
61d0: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
61e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
61f0: 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70  rt( frag<=data[p
6200: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
6210: 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61  7] );.      data
6220: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
6230: 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20  t+7] -= frag;.  
6240: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6250: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32  ta[pbegin], get2
6260: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
6270: 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  ]));.      put2b
6280: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6290: 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62  +2], pnext+get2b
62a0: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
62b0: 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20  2])-pbegin);.   
62c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
62d0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
62e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
62f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6300: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
6310: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
6320: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
6330: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
6340: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
6350: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
6360: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
6370: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
6380: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
6390: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
63a0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
63b0: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
63c0: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
63d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
63e0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
63f0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
6400: 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32  r+5], top + get2
6410: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6420: 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n+2]));.  }.}../
6430: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
6440: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
6450: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
6460: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
6470: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
6480: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
6490: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
64a0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
64b0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
64c0: 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  id decodeFlags(M
64d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
64e0: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
64f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
6500: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
6510: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
6520: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6530: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
6540: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
6550: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
6560: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
6570: 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
6580: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6590: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
65a0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50 54   (flagByte & (PT
65b0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
65c0: 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50  FDATA))!=0;.  pP
65d0: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20  age->zeroData = 
65e0: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
65f0: 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20  ZERODATA)!=0;.  
6600: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66  pPage->leaf = (f
6610: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6620: 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  AF)!=0;.  pPage-
6630: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
6640: 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  4*(pPage->leaf==
6650: 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  0);.  pBt = pPag
6660: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
6670: 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41  agByte & PTF_LEA
6680: 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  FDATA ){.    pPa
6690: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 31  ge->leafData = 1
66a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
66b0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
66c0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
66d0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
66e0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
66f0: 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65  e{.    pPage->le
6700: 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  afData = 0;.    
6710: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
6720: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
6730: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
6740: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
6750: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ocal;.  }.  pPag
6760: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70  e->hasData = !(p
6770: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c  Page->zeroData |
6780: 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  | (!pPage->leaf 
6790: 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  && pPage->leafDa
67a0: 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ta));.}../*.** I
67b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
67c0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
67d0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
67e0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lock..**.** The 
67f0: 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
6800: 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  r must be a poin
6810: 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
6820: 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74  ge which.** is t
6830: 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
6840: 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74   page being init
6850: 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f  ialized.  The ro
6860: 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65  ot of a.** BTree
6870: 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61   has no parent a
6880: 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70  nd so for that p
6890: 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55  age, pParent==NU
68a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LL..**.** Return
68b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
68c0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
68d0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
68e0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
68f0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
6900: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
6910: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
6920: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
6930: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
6940: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
6950: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
6960: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
6970: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
6980: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
6990: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
69a0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
69b0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
69c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
69d0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20 20  treeInitPage(.  
69e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
69f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6a00: 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  ge to be initial
6a10: 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ized */.  MemPag
6a20: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  e *pParent      
6a30: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20   /* The parent. 
6a40: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20  /.){.  int pc;  
6a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6a70: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
6a80: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
6a90: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  ->aData[] */.  i
6aa0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
6ab0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
6ac0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
6ad0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20   header */.  u8 
6ae0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
6af0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
6b00: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74  e->aData */.  Bt
6b10: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
6b20: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
6b30: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
6b40: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
6b50: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
6b60: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
6b70: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
6b80: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6b90: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
6ba0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
6bb0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
6bc0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
6bd0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
6be0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
6bf0: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
6c00: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  he page */.  int
6c10: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
6c20: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
6c30: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6c40: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74  t area */..  pBt
6c50: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6c60: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
6c70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6c80: 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65  rent==0 || pPare
6c90: 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  nt->pBt==pBt );.
6ca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6cb0: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
6cc0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6cd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6ce0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
6cf0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
6d00: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
6d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6d20: 3e 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73  >aData == &((uns
6d30: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67  igned char*)pPag
6d40: 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e)[-pBt->pageSiz
6d50: 65 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  e] );.  if( pPag
6d60: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72  e->pParent!=pPar
6d70: 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70  ent && (pPage->p
6d80: 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61  Parent!=0 || pPa
6d90: 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20  ge->isInit) ){. 
6da0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
6db0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76   page should nev
6dc0: 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73  er change unless
6dd0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
6de0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
6df0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6e00: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
6e10: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
6e20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6e30: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  OK;.  if( pPage-
6e40: 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70  >pParent==0 && p
6e50: 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20  Parent!=0 ){.   
6e60: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
6e70: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  = pParent;.    s
6e80: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
6e90: 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
6ea0: 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
6eb0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
6ec0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
6ed0: 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46  aData;.  decodeF
6ee0: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
6ef0: 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d  [hdr]);.  pPage-
6f00: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
6f10: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
6f20: 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  t = 0;.  usableS
6f30: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
6f40: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
6f50: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
6f60: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
6f70: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
6f80: 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  af;.  top = get2
6f90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6fa0: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  ]);.  pPage->nCe
6fb0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
6fc0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69  ata[hdr+3]);.  i
6fd0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
6fe0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
6ff0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
7000: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
7010: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
7020: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
7030: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
7040: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7050: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
7060: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Page->nCell==0 &
7070: 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20  & pParent!=0 && 
7080: 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
7090: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70   ){.    /* All p
70a0: 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61  ages must have a
70b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
70c0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f  , except for roo
70d0: 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  t pages */.    r
70e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
70f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
7100: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
7110: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
7120: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
7130: 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
7140: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
7150: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
7160: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
7170: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
7180: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77  age->nCell);.  w
7190: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
71a0: 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65    int next, size
71b0: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61  ;.    if( pc>usa
71c0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
71d0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
71e0: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
71f0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7200: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7210: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
7220: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
7230: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
7240: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
7250: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
7260: 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26     if( next>0 &&
7270: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
7280: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
7290: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
72a0: 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
72b0: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
72c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
72d0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
72e0: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a      nFree += siz
72f0: 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74  e;.    pc = next
7300: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
7310: 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20  Free = nFree;.  
7320: 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c  if( nFree>=usabl
7330: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eSize ){.    /* 
7340: 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f  Free space canno
7350: 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70  t exceed total p
7360: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
7370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7380: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
7390: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
73a0: 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
73b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
73c0: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
73d0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
73e0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
73f0: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
7400: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
7410: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7420: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
7430: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
7440: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
7450: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
7460: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
7470: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
7480: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
7490: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
74a0: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
74b0: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
74c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
74d0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
74e0: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
74f0: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
7500: 28 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67  ( &data[pBt->pag
7510: 65 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67  eSize] == (unsig
7520: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
7530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7540: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7550: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
7560: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7570: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
7580: 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74  texHeld(pBt->mut
7590: 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ex) );.  memset(
75a0: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
75b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
75c0: 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64   hdr);.  data[hd
75d0: 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69  r] = flags;.  fi
75e0: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
75f0: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
7600: 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65  AF)==0);.  memse
7610: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
7620: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
7630: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
7640: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
7650: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
7660: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
7670: 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ree = pBt->usabl
7680: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20  eSize - first;. 
7690: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
76a0: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
76b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
76c0: 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63   hdr;.  pPage->c
76d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
76e0: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  t;.  pPage->nOve
76f0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
7700: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
7710: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
7720: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
7730: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sInit = 1;.}../*
7740: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
7750: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
7760: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
7770: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
7780: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
7790: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
77a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
77b0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
77c0: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
77d0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
77e0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
77f0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
7800: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
7810: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
7820: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
7830: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
7840: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
7850: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
7860: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
7870: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
7880: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
7890: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
78a0: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
78b0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
78c0: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
78d0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
78e0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
78f0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
7900: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
7910: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
7920: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7930: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
7940: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
7950: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
7960: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
7970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7980: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
7990: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
79a0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
79b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
79c0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
79d0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
79e0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
79f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
7a00: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
7a10: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
7a20: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
7a30: 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65  *pPage;.  DbPage
7a40: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
7a50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
7a60: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d  eeMutexHeld(pBt-
7a70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
7a80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
7a90: 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
7aa0: 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
7ab0: 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43  **)&pDbPage, noC
7ac0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  ontent);.  if( r
7ad0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7ae0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
7af0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
7b00: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
7b10: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
7b20: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
7b30: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7b40: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
7b50: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
7b60: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
7b70: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
7b80: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
7b90: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
7ba0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
7bb0: 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65  0 : 0;.  *ppPage
7bc0: 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75   = pPage;.  retu
7bd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7be0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
7bf0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
7c00: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
7c10: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
7c20: 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63  e.** is just a c
7c30: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
7c40: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
7c50: 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  te calls to.** s
7c60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
7c70: 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ge() and sqlite3
7c80: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
7c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7ca0: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
7cb0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
7cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ce0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
7cf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7d00: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
7d10: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
7d20: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7d30: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
7d40: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
7d50: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
7d60: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
7d70: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
7d80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7d90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
7da0: 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42  treeMutexHeld(pB
7db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
7dc0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
7dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7de0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7df0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7e00: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
7e10: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
7e20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7e30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
7e40: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
7e50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7e60: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
7e70: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
7e80: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
7e90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
7ea0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
7eb0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
7ec0: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
7ed0: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
7ee0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
7ef0: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
7f00: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7f10: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
7f20: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
7f30: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
7f40: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
7f50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f60: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7f70: 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67 65    assert( &pPage
7f80: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70  ->aData[pPage->p
7f90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28  Bt->pageSize]==(
7fa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
7fb0: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
7fc0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
7fd0: 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d  MutexHeld(pPage-
7fe0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
7ff0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
8000: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
8010: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
8020: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8030: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
8040: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8050: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  unt for a page.*
8060: 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  * reaches zero. 
8070: 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65   We need to unre
8080: 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f  f the pParent po
8090: 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a  inter when that.
80a0: 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73  ** happens..*/.s
80b0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44  tatic void pageD
80c0: 65 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65  estructor(DbPage
80d0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
80e0: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
80f0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
8100: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
8110: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
8120: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
8130: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8140: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
8150: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
8160: 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
8170: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
8180: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73  >pParent;.    as
8190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
81a0: 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  eeMutexHeld(pPag
81b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
81c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61  ;.    pPage->pPa
81d0: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  rent = 0;.    re
81e0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
81f0: 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  t);.  }.  pPage-
8200: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a  >isInit = 0;.}..
8210: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
8220: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
8230: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
8240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
8250: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
8260: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
8270: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
8280: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
8290: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
82a0: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
82b0: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
82c0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
82d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
82e0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
82f0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
8300: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
8310: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
8320: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
8330: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
8340: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
8350: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
8360: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
8370: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
8380: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
8390: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
83a0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
83b0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
83c0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
83d0: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
83e0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
83f0: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
8400: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
8410: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
8420: 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61  reeMutexHeld(pPa
8430: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8440: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
8450: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  Init = 0;.    sq
8460: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8470: 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
8480: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  >pParent);.  }.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
84a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
84b0: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
84c0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
84d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
84e0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
84f0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
8500: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
8510: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
8520: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
8530: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
8540: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
8550: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
8560: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
8570: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
8580: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
8590: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
85a0: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
85b0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
85c0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
85d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
85e0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
85f0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
8600: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
8610: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
8620: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
8630: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
8640: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
8650: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
8660: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70   */.  sqlite3 *p
8670: 53 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a  Sqlite,       /*
8680: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
8690: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
86a0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
86b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
86c0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
86d0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
86e0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
86f0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
8700: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
8710: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
8720: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
8730: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
8740: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
8750: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
8760: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 68   = 0;      /* Sh
8770: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
8780: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
8790: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
87b0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
87c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
87d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65  TE_OK;.  int nRe
87e0: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
87f0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
8800: 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74  [100];..  /* Set
8810: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
8820: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
8830: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
8840: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
8850: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
8860: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
8870: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
8880: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
8890: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
88a0: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
88b0: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
88c0: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
88d0: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
88e0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
88f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
8900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
8910: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
8920: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8930: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
8940: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
8950: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
8960: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
8970: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
8980: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
8990: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
89a0: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
89b0: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
89c0: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
89d0: 64 69 66 0a 0a 20 20 69 66 28 20 70 53 71 6c 69  dif..  if( pSqli
89e0: 74 65 20 29 7b 0a 20 20 20 20 70 56 66 73 20 3d  te ){.    pVfs =
89f0: 20 70 53 71 6c 69 74 65 2d 3e 70 56 66 73 3b 0a   pSqlite->pVfs;.
8a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 56 66    }else{.    pVf
8a10: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
8a20: 66 69 6e 64 28 30 29 3b 0a 20 20 7d 0a 20 20 61  find(0);.  }.  a
8a30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
8a40: 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 53 71  reeMutexHeld(pSq
8a50: 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  lite->mutex) );.
8a60: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
8a70: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
8a80: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
8a90: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8aa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8ab0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
8ac0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
8ad0: 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c  ->pSqlite = pSql
8ae0: 69 74 65 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  ite;..#if !defin
8af0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8b00: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8b10: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8b20: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
8b30: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
8b40: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
8b50: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
8b60: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
8b70: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
8b80: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
8b90: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
8ba0: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
8bb0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42 54   if( (flags & BT
8bc0: 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30 0a  REE_PRIVATE)==0.
8bd0: 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d 30     && isMemdb==0
8be0: 0a 20 20 20 26 26 20 28 70 53 71 6c 69 74 65 3d  .   && (pSqlite=
8bf0: 3d 30 20 7c 7c 20 28 70 53 71 6c 69 74 65 2d 3e  =0 || (pSqlite->
8c00: 66 6c 61 67 73 20 26 53 51 4c 49 54 45 5f 56 74  flags &SQLITE_Vt
8c10: 61 62 29 3d 3d 30 29 0a 20 20 20 26 26 20 7a 46  ab)==0).   && zF
8c20: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
8c30: 6e 61 6d 65 5b 30 5d 0a 20 20 20 26 26 20 73 71  name[0].   && sq
8c40: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
8c50: 45 6e 61 62 6c 65 64 0a 20 20 29 7b 0a 20 20 20  Enabled.  ){.   
8c60: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
8c70: 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 73  name = (char *)s
8c80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56  qlite3_malloc(pV
8c90: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b  fs->mxPathname);
8ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8cb0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
8cc0: 0a 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65  .    p->sharable
8cd0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
8ce0: 71 6c 69 74 65 20 29 7b 0a 20 20 20 20 20 20 70  qlite ){.      p
8cf0: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 7c 3d  Sqlite->flags |=
8d00: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
8d10: 63 68 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  che;.    }.    i
8d20: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
8d30: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
8d40: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
8d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8d60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
8d70: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
8d80: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
8d90: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
8da0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 75 74 65  hname);.    mute
8db0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
8dc0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
8dd0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
8de0: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 73  C_MASTER);.    s
8df0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8e00: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
8e10: 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 73 71 6c  .    for(pBt=sql
8e20: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
8e30: 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  ist; pBt; pBt=pB
8e40: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
8e50: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
8e60: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66  ef>0 );.      if
8e70: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
8e80: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
8e90: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
8ea0: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b  pBt->pPager)) ){
8eb0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20  .        p->pBt 
8ec0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
8ed0: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
8ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8f00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8f10: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
8f20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8f30: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8f40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
8f50: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
8f60: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
8f70: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
8f80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
8f90: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
8fa0: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
8fb0: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
8fc0: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
8fd0: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
8fe0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
8ff0: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
9000: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
9010: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
9020: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
9030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
9040: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
9050: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
9060: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9070: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
9080: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
9090: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
90a0: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
90b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
90c0: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
90d0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
90e0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
90f0: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
9100: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
9110: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
9120: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
9130: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9140: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
9150: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
9160: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
9170: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
9180: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
9190: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
91a0: 65 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66  e, EXTRA_SIZE, f
91b0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
91c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
91d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
91e0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
91f0: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
9200: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
9210: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
9220: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9230: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9240: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9250: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9260: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
9270: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
9280: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
9290: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
92a0: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
92b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
92c0: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
92d0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
92e0: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
92f0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
9300: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
9310: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
9320: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
9330: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
9340: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
9350: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
9360: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
9370: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
9380: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
9390: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
93a0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
93b0: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
93c0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
93d0: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
93e0: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
93f0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9400: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
9410: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
9420: 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
9430: 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46    pBt->maxEmbedF
9440: 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20 32  rac = 64;   /* 2
9450: 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d  5% */.      pBt-
9460: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
9470: 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a  32;   /* 12.5% *
9480: 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  /.      pBt->min
9490: 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20  LeafFrac = 32;  
94a0: 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69    /* 12.5% */.#i
94b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
94c0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
94d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
94e0: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
94f0: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
9500: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9510: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
9520: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
9530: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
9540: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
9550: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
9560: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
9570: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
9580: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
9590: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
95a0: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
95b0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
95c0: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
95d0: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
95e0: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
95f0: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
9600: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
9610: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
9620: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
9630: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
9640: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9650: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
9660: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
9670: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
9680: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9690: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
96a0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
96b0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
96c0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
96d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
96e0: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
96f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
9700: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
9710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
9720: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
9730: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
9740: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
9750: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d 3b  = zDbHeader[21];
9760: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45  .      pBt->minE
9770: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
9780: 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20 20  ader[22];.      
9790: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
97a0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33 5d   = zDbHeader[23]
97b0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
97c0: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
97d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
97e0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
97f0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
9800: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
9810: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
9820: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
9830: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
9840: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
9850: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
9860: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
9870: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  f.    }.    pBt-
9880: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
9890: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
98a0: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
98b0: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
98c0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
98d0: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
98e0: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
98f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
9900: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
9910: 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
9920: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23  pageSize);.   .#
9930: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9940: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
9950: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
9960: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
9970: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
9980: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
9990: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
99a0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
99b0: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
99c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
99d0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
99e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
99f0: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
9a00: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
9a10: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
9a20: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
9a30: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
9a40: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
9a50: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
9a60: 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
9a70: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
9a80: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
9a90: 53 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ST);.      sqlit
9aa0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
9ab0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
9ac0: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
9ad0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
9ae0: 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71  heList;.      sq
9af0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
9b00: 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  List = pBt;.    
9b10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9b20: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
9b30: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
9b40: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
9b50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
9b60: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
9b70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9b80: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
9b90: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
9ba0: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
9bb0: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
9bc0: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
9bd0: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
9be0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
9bf0: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
9c00: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
9c10: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
9c20: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
9c30: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
9c40: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
9c50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
9c60: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
9c70: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
9c80: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
9c90: 69 3d 30 3b 20 69 3c 70 53 71 6c 69 74 65 2d 3e  i=0; i<pSqlite->
9ca0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
9cb0: 20 69 66 28 20 28 70 53 69 62 20 3d 20 70 53 71   if( (pSib = pSq
9cc0: 6c 69 74 65 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  lite->aDb[i].pBt
9cd0: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
9ce0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
9cf0: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
9d00: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
9d10: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
9d20: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
9d30: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
9d40: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
9d50: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
9d60: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
9d70: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
9d80: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
9d90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9da0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
9db0: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
9dc0: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
9dd0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
9de0: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
9df0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
9e00: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
9e10: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
9e20: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
9e30: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
9e40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
9e50: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
9e60: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
9e70: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
9e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9e90: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
9ea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9eb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9ec0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
9ed0: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
9ee0: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
9ef0: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
9f00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
9f10: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
9f20: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
9f30: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
9f40: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
9f50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9f60: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
9f70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
9f80: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
9f90: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9fa0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
9fb0: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
9fc0: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
9fd0: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
9fe0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
9ff0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
a000: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
a010: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
a020: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
a030: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
a040: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
a050: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
a060: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
a070: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
a080: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
a090: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
a0a0: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
a0b0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
a0c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a0d0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
a0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
a0f0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
a100: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
a110: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
a120: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a130: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
a140: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
a150: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
a160: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
a170: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
a180: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
a190: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
a1a0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
a1b0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
a1c0: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
a1d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68     if( sqlite3Sh
a1e0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d 70  aredCacheList==p
a1f0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
a200: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a210: 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  st = pBt->pNext;
a220: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a230: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
a240: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
a250: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
a260: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 70  List && pList->p
a270: 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
a280: 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
a290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a2a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
a2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
a2c0: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
a2d0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
a2e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a2f0: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
a300: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 6d  >mutex);.    rem
a310: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
a320: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a330: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
a340: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
a350: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
a360: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a370: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
a380: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
a390: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
a3a0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
a3b0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
a3c0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
a3d0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
a3e0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
a3f0: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
a400: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
a410: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
a420: 64 6c 65 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  dle.  */.  sqlit
a430: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
a440: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
a450: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
a460: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
a470: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
a480: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
a490: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
a4a0: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
a4b0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
a4c0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
a4d0: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
a4e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
a4f0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
a500: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
a510: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
a520: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
a530: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
a540: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a550: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
a560: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
a570: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
a580: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
a590: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
a5a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
a5b0: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
a5c0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
a5d0: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
a5e0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
a5f0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
a600: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
a610: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
a620: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
a630: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
a640: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
a650: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
a660: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a670: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
a680: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
a690: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
a6a0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
a6b0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
a6c0: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
a6d0: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
a6e0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
a6f0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
a700: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
a710: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
a720: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
a730: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
a740: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
a750: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
a760: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
a770: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
a780: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
a790: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
a7a0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
a7b0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
a7c0: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
a7d0: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
a7e0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
a7f0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
a800: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
a810: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a820: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
a830: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a840: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
a850: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a860: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
a870: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
a880: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
a890: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
a8a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
a8b0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
a8c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
a8d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
a8e0: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
a8f0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
a900: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
a910: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
a920: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a930: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
a940: 41 44 53 41 46 45 20 26 26 20 21 64 65 66 69 6e  ADSAFE && !defin
a950: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a960: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
a970: 2a 2a 20 53 68 6f 72 74 2d 63 75 74 73 20 66 6f  ** Short-cuts fo
a980: 72 20 65 6e 74 65 72 69 6e 67 20 61 6e 64 20 6c  r entering and l
a990: 65 61 76 69 6e 67 20 6d 75 74 65 78 65 73 20 6f  eaving mutexes o
a9a0: 6e 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  n a cursor..*/.s
a9b0: 74 61 74 69 63 20 76 6f 69 64 20 63 75 72 73 6f  tatic void curso
a9c0: 72 4c 65 61 76 65 28 42 74 43 75 72 73 6f 72 20  rLeave(BtCursor 
a9d0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 74  *p){.  sqlite3Bt
a9e0: 72 65 65 4c 65 61 76 65 28 70 2d 3e 70 42 74 72  reeLeave(p->pBtr
a9f0: 65 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ee);.}.static vo
aa00: 69 64 20 63 75 72 73 6f 72 45 6e 74 65 72 28 42  id cursorEnter(B
aa10: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
aa20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
aa30: 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ter(pCur->pBtree
aa40: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
aa50: 69 6e 65 20 63 75 72 73 6f 72 45 6e 74 65 72 28  ine cursorEnter(
aa60: 58 29 0a 23 20 64 65 66 69 6e 65 20 63 75 72 73  X).# define curs
aa70: 6f 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69  orLeave(X).#endi
aa80: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
aa90: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
aaa0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
aab0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
aac0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
aad0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
aae0: 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48 61  e3BtreeSetBusyHa
aaf0: 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c 20  ndler(Btree *p, 
ab00: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48 61  BusyHandler *pHa
ab10: 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61 72  ndler){.  BtShar
ab20: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
ab30: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
ab40: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
ab50: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
ab60: 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69  pHandler;.  sqli
ab70: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
ab80: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
ab90: 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20  er, pHandler);. 
aba0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
abb0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
abc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
abd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
abe0: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
abf0: 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
ac00: 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
ac10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
ac20: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
ac30: 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
ac40: 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
ac50: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
ac60: 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
ac70: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
ac80: 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
ac90: 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
aca0: 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
acb0: 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
acc0: 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
acd0: 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
ace0: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
acf0: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
ad00: 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
ad10: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
ad20: 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
ad30: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
ad40: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
ad50: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
ad60: 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
ad70: 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
ad80: 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
ad90: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
ada0: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
adb0: 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
adc0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
add0: 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
ade0: 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
adf0: 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
ae00: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
ae10: 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
ae20: 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
ae30: 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
ae40: 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
ae50: 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
ae60: 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
ae70: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
ae80: 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
ae90: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
aea0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
aeb0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
aec0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
aed0: 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
aee0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
aef0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
af00: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
af10: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
af20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
af30: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
af40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
af50: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
af60: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
af70: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
af80: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
af90: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
afa0: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
afb0: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
afc0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
afd0: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
afe0: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
aff0: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
b000: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
b010: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
b020: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
b030: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
b040: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
b050: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
b060: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
b070: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
b080: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
b090: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
b0a0: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
b0b0: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
b0c0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
b0d0: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
b0e0: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
b0f0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
b100: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
b110: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b120: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
b130: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
b140: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
b150: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
b160: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
b170: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b180: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
b190: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b1a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
b1b0: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
b1c0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
b1d0: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
b1e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b1f0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
b200: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
b210: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b220: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
b230: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
b240: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
b250: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
b260: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
b270: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
b280: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
b290: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
b2a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
b2b0: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
b2c0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
b2d0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
b2e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
b2f0: 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
b300: 70 50 61 67 65 72 20 29 3b 0a 20 20 73 71 6c 69  pPager );.  sqli
b310: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
b320: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
b330: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
b340: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
b350: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b360: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b370: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
b390: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
b3a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b3b0: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
b3c0: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
b3d0: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
b3e0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
b3f0: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
b400: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
b410: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
b420: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
b430: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
b440: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
b450: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
b460: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
b470: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
b480: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
b490: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
b4a0: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
b4b0: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
b4c0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
b4d0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
b4e0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
b4f0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
b500: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
b510: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
b520: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
b530: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
b540: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
b550: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
b560: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
b570: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
b580: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
b590: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
b5a0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
b5b0: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
b5c0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
b5d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
b5e0: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
b5f0: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
b600: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
b610: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
b620: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
b630: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
b640: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
b650: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b660: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
b670: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
b680: 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
b690: 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
b6a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
b6b0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
b6c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
b6d0: 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
b6e0: 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
b6f0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
b700: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
b710: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
b720: 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  }.  if( pageSize
b730: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
b740: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
b750: 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
b760: 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
b770: 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
b780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
b790: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
b7a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
b7b0: 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
b7c0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
b7d0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
b7e0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
b7f0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
b800: 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65  pPager, pageSize
b810: 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73  );.  }.  pBt->us
b820: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
b830: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
b840: 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  rve;.  sqlite3Bt
b850: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b880: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
b890: 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
b8a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b8b0: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
b8c0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
b8d0: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
b8e0: 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Size;.}.int sqli
b8f0: 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
b900: 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
b910: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
b920: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
b930: 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
b940: 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
b950: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
b960: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b970: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
b980: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b990: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
b9a0: 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
b9b0: 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
b9c0: 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
b9d0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
b9e0: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
b9f0: 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
ba00: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
ba10: 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
ba20: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
ba30: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
ba40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ba50: 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
ba60: 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
ba70: 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
ba80: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
ba90: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
baa0: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
bab0: 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
bac0: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
bad0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bae0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
baf0: 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn n;.}.#endif /
bb00: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
bb10: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
bb20: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
bb30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
bb40: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
bb50: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
bb60: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
bb70: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
bb80: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
bb90: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
bba0: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
bbb0: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
bbc0: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
bbd0: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
bbe0: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
bbf0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
bc00: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
bc10: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
bc20: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
bc30: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
bc40: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
bc50: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
bc60: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
bc70: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
bc80: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
bc90: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
bca0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
bcb0: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
bcc0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
bcd0: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
bce0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
bcf0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bd00: 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75  ;.  int av = (au
bd10: 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a  toVacuum?1:0);..
bd20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
bd30: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
bd40: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
bd50: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
bd60: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
bd70: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
bd80: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
bd90: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
bda0: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
bdb0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
bdc0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
bdd0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
bde0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
bdf0: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
be00: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
be10: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
be20: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
be30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
be40: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
be50: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
be60: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
be70: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
be80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
be90: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
bea0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
beb0: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
bec0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
bed0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
bee0: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
bef0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
bf00: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
bf10: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
bf20: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
bf30: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
bf40: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
bf50: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
bf60: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
bf70: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
bf80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
bf90: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
bfa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
bfb0: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
bfc0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
bfd0: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
bfe0: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
bff0: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
c000: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c010: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
c020: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
c030: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
c040: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
c050: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
c060: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
c080: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
c090: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
c0a0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c0b0: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
c0c0: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
c0d0: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
c0e0: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
c0f0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
c100: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
c110: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67  ){.  int rc, pag
c120: 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65  eSize;.  MemPage
c130: 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73   *pPage1;..  ass
c140: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
c150: 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e  eMutexHeld(pBt->
c160: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c170: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c1a0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
c1b0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
c1c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c1d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c1e0: 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  .  ..  /* Do som
c1f0: 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
c200: 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
c210: 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
c220: 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
c230: 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
c240: 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
c250: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
c260: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
c270: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
c280: 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20  pPager)>0 ){.   
c290: 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
c2a0: 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
c2b0: 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
c2c0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
c2d0: 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
c2e0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
c2f0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
c300: 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
c310: 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
c320: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
c330: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
c340: 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
c350: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
c360: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
c370: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
c380: 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
c390: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
c3a0: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
c3b0: 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
c3c0: 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20  ze<512 ){.      
c3d0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
c3e0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
c3f0: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
c400: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
c410: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
c420: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
c430: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c440: 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
c450: 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
c460: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c470: 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <500 ){.      go
c480: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
c490: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
c4a0: 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
c4b0: 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20  c = page1[21];. 
c4c0: 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64     pBt->minEmbed
c4d0: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d  Frac = page1[22]
c4e0: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  ;.    pBt->minLe
c4f0: 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32  afFrac = page1[2
c500: 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  3];.#ifndef SQLI
c510: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c520: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
c530: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
c540: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
c550: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
c560: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
c570: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
c580: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
c590: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
c5a0: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
c5b0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
c5c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
c5d0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
c5e0: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
c5f0: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
c600: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
c610: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
c620: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
c630: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
c640: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
c650: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
c660: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
c670: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
c680: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
c690: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
c6a0: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
c6b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
c6c0: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
c6d0: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
c6e0: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
c6f0: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
c700: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
c710: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
c720: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
c730: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
c740: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
c750: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
c760: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
c770: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
c780: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
c790: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
c7a0: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
c7b0: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
c7c0: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
c7d0: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
c7e0: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
c7f0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
c800: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
c810: 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64  2)*pBt->maxEmbed
c820: 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20  Frac/255 - 23;. 
c830: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
c840: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
c850: 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d  e-12)*pBt->minEm
c860: 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33  bedFrac/255 - 23
c870: 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
c880: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
c890: 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
c8a0: 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
c8b0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
c8c0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f  Bt->minLeafFrac/
c8d0: 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20  255 - 23;.  if( 
c8e0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42  pBt->minLocal>pB
c8f0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70  t->maxLocal || p
c900: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29  Bt->maxLocal<0 )
c910: 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
c920: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
c930: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
c940: 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
c950: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
c960: 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
c970: 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
c980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c990: 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
c9a0: 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
c9b0: 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
c9c0: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
c9d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c9e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c9f0: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f  ne works like lo
ca00: 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74  ckBtree() except
ca10: 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e   that it also in
ca20: 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73  vokes the.** bus
ca30: 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
ca40: 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74  ere is lock cont
ca50: 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ention..*/.stati
ca60: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57  c int lockBtreeW
ca70: 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a  ithRetry(Btree *
ca80: 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRef){.  int rc 
ca90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
caa0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
cab0: 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 52  treeMutexHeld(pR
cac0: 65 66 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74  ef->pSqlite->mut
cad0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
cae0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
caf0: 65 78 48 65 6c 64 28 70 52 65 66 2d 3e 70 42 74  exHeld(pRef->pBt
cb00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
cb10: 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
cb20: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
cb30: 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
cb40: 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
cb50: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
cb60: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
cb70: 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
cb80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
cb90: 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
cba0: 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
cbb0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
cbc0: 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
cbd0: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
cbe0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
cbf0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
cc00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
cc10: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
cc20: 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
cc30: 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
cc40: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
cc50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
cc60: 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
cc70: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
cc80: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
cc90: 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
cca0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
ccb0: 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
ccc0: 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
ccd0: 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
cce0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
ccf0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
cd00: 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
cd10: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
cd20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
cd30: 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
cd40: 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
cd50: 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
cd60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
cd70: 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
cd80: 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
cd90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
cda0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
cdb0: 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
cdc0: 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
cdd0: 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
cde0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
cdf0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
ce00: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
ce10: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ce20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ce30: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
ce40: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ce50: 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
ce60: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
ce70: 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72  ONE && pBt->pCur
ce80: 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70  sor==0 && pBt->p
ce90: 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
cea0: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
ceb0: 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
cec0: 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20  ager)>=1 ){.    
ced0: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
cee0: 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
cef0: 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
cf00: 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
cf10: 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
cf20: 67 65 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75  ge->aData = &((u
cf30: 38 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e  8*)pPage)[-pBt->
cf40: 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20  pageSize];.     
cf50: 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
cf60: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61  pBt;.        pPa
cf70: 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ge->pgno = 1;.  
cf80: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
cf90: 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
cfa0: 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
cfb0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
cfc0: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
cfd0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
cfe0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
cff0: 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
d000: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
d010: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
d020: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
d030: 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
d040: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
d050: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
d060: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
d070: 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
d080: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
d090: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
d0a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d0b0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
d0c0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
d0d0: 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20  Bt->pPager)>0 ) 
d0e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d0f0: 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  ;.  pP1 = pBt->p
d100: 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
d110: 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
d120: 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
d130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
d140: 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
d150: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
d160: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d170: 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
d180: 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
d190: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
d1a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
d1b0: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
d1c0: 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
d1d0: 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
d1e0: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
d1f0: 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
d200: 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
d210: 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
d220: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
d230: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
d240: 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61  ta[21] = pBt->ma
d250: 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61  xEmbedFrac;.  da
d260: 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69  ta[22] = pBt->mi
d270: 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61  nEmbedFrac;.  da
d280: 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69  ta[23] = pBt->mi
d290: 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d  nLeafFrac;.  mem
d2a0: 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
d2b0: 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
d2c0: 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
d2d0: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
d2e0: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
d2f0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
d300: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
d310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d320: 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
d330: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
d340: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
d350: 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
d360: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
d370: 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
d380: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
d390: 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
d3a0: 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
d3b0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
d3c0: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
d3d0: 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
d3e0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
d3f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
d400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d410: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
d420: 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
d430: 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
d440: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
d450: 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
d460: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d470: 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
d480: 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
d490: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
d4a0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
d4b0: 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
d4c0: 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
d4d0: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
d4e0: 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
d4f0: 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
d500: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
d510: 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
d520: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
d530: 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
d540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
d550: 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
d560: 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
d570: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
d580: 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
d590: 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
d5a0: 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
d5b0: 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
d5c0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
d5d0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
d5e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
d5f0: 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
d600: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
d610: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
d620: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
d630: 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
d640: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
d650: 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
d660: 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
d670: 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
d680: 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
d690: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
d6a0: 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
d6b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
d6c0: 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
d6d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d6e0: 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
d6f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d700: 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
d710: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d720: 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
d730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
d740: 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
d750: 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
d760: 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
d770: 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
d780: 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
d790: 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
d7a0: 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
d7b0: 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
d7c0: 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
d7d0: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
d7e0: 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
d7f0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
d800: 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
d810: 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
d820: 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
d830: 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
d840: 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
d850: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
d860: 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
d870: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
d880: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
d890: 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
d8a0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d8b0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
d8c0: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
d8d0: 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
d8e0: 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
d8f0: 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
d900: 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
d910: 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
d920: 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
d930: 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
d940: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
d950: 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
d960: 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
d970: 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
d980: 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
d990: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
d9a0: 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
d9b0: 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
d9c0: 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
d9d0: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
d9e0: 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
d9f0: 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
da00: 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
da10: 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
da20: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
da30: 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
da40: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
da50: 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
da60: 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
da70: 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
da80: 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
da90: 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
daa0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
dab0: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
dac0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
dad0: 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
dae0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
daf0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
db00: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
db10: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
db20: 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
db30: 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
db40: 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
db50: 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
db60: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
db70: 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
db80: 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
db90: 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
dba0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
dbb0: 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
dbc0: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
dbd0: 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
dbe0: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
dbf0: 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
dc00: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
dc10: 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
dc20: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
dc30: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
dc40: 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
dc50: 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
dc60: 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
dc70: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
dc80: 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
dc90: 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  ly && wrflag ){.
dca0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dcb0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
dcc0: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
dcd0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f    }..  /* If ano
dce0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
dcf0: 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
dd00: 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
dd10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
dd20: 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
dd30: 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
dd40: 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
dd50: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
dd60: 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
dd70: 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
dd80: 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  _BUSY..  */.  if
dd90: 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
dda0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
ddb0: 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  E && wrflag ){. 
ddc0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ddd0: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  USY;.    goto tr
dde0: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
ddf0: 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70    do {.    if( p
de00: 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
de10: 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
de20: 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  Btree(pBt);.    
de30: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
de40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
de50: 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
de60: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
de70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
de80: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
de90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dea0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
deb0: 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
dec0: 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c  pPage1->pDbPage,
ded0: 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20   wrflag>1);.    
dee0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
def0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
df00: 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
df10: 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
df20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
df30: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d  }.  .    if( rc=
df40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
df50: 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
df60: 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
df70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
df80: 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
df90: 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
dfa0: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
dfb0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
dfc0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
dfd0: 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
dfe0: 26 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  &.          sqli
dff0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
e000: 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73 79 48  dler(pBt->pBusyH
e010: 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66  andler) );..  if
e020: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e030: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
e040: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
e050: 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
e060: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
e070: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
e080: 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
e090: 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
e0a0: 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
e0b0: 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
e0c0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
e0d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
e0e0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
e0f0: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
e100: 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
e110: 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
e120: 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
e130: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e140: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
e150: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e160: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
e170: 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
e180: 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
e190: 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
e1a0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
e1b0: 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
e1c0: 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
e1d0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
e1e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
e1f0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
e200: 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
e210: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
e220: 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
e230: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
e240: 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
e250: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
e260: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
e290: 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
e2a0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e2c0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
e2d0: 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
e2e0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e310: 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
e320: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
e330: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49  ->pBt;.  int isI
e340: 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
e350: 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
e360: 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
e370: 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
e380: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
e390: 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  Held(pPage->pBt-
e3a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
e3b0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
e3c0: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
e3d0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
e3e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e3f0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
e400: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
e410: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
e420: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
e430: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
e440: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
e450: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
e460: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
e470: 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
e480: 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
e490: 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
e4a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e4b0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
e4c0: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
e4d0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
e4e0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
e4f0: 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
e500: 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
e510: 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
e520: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
e530: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
e540: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
e550: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
e560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e570: 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
e580: 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
e590: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
e5a0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e5b0: 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
e5c0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
e5d0: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
e5e0: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
e5f0: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
e600: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
e610: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
e620: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
e630: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
e640: 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
e650: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
e660: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e670: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
e680: 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
e690: 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
e6a0: 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
e6b0: 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
e6c0: 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
e6d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
e6e0: 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
e6f0: 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
e700: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
e710: 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
e720: 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
e730: 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
e740: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
e750: 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
e760: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
e770: 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
e780: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
e790: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
e7a0: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
e7b0: 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
e7c0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
e7d0: 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
e7e0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
e7f0: 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
e800: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
e810: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
e820: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
e850: 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
e860: 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
e870: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
e880: 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
e890: 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
e8a0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
e8b0: 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
e8c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e8d0: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
e8e0: 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
e8f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
e900: 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
e910: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
e920: 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
e930: 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
e940: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e950: 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
e960: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
e970: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ex) );.  if( eTy
e980: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
e990: 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
e9a0: 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
e9b0: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
e9c0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
e9d0: 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
e9e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
e9f0: 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
ea00: 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
ea10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ea20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ea30: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
ea40: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
ea50: 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
ea60: 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
ea70: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
ea80: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
ea90: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
eaa0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
eab0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
eac0: 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
ead0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
eae0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
eaf0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
eb00: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
eb10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
eb20: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
eb30: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
eb40: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
eb50: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
eb60: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
eb70: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
eb80: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
eb90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
eba0: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
ebc0: 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
ebd0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
ebe0: 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
ebf0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
ec00: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
ec10: 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
ec20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ec30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ec40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ec50: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
ec60: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
ec70: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
ec80: 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
ec90: 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
eca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ecb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ecc0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
ecd0: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
ece0: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
ecf0: 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
ed00: 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
ed10: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
ed20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
ed30: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
ed40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ed50: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ed60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
ed70: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
ed80: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
ed90: 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
eda0: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
edb0: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
edc0: 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
edd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ede0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
edf0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
ee00: 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
ee10: 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
ee20: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
ee30: 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
ee40: 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
ee50: 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
ee60: 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
ee70: 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
ee80: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
ee90: 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
eea0: 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
eeb0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
eec0: 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
eed0: 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eef0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
ef00: 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
ef10: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
ef20: 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
ef30: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
ef40: 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
ef50: 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
ef60: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
ef70: 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
ef80: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
ef90: 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
efa0: 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
efb0: 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
efc0: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
efd0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
efe0: 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
eff0: 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
f000: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
f010: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
f020: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
f030: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
f040: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
f050: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
f060: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
f070: 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
f080: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
f090: 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
f0a0: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
f0b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f0c0: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
f0d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
f0e0: 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
f0f0: 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 27 73  DbPage from it's
f100: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f110: 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
f120: 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
f130: 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
f140: 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
f150: 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
f160: 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
f170: 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
f180: 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
f190: 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
f1a0: 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
f1b0: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
f1c0: 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
f1d0: 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
f1e0: 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  ePage);.  if( rc
f1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f200: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f210: 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
f220: 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
f230: 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
f240: 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
f250: 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
f260: 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
f270: 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
f280: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
f290: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
f2a0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
f2b0: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
f2c0: 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
f2d0: 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
f2e0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
f2f0: 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
f300: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
f310: 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
f320: 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
f330: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
f340: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
f350: 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
f360: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
f370: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
f380: 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
f390: 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
f3a0: 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
f3b0: 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
f3c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
f3d0: 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
f3e0: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
f3f0: 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
f400: 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
f410: 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
f420: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f430: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f440: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f450: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
f460: 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
f470: 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
f480: 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
f490: 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
f4a0: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
f4b0: 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
f4c0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
f4d0: 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
f4e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f4f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f500: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f510: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f520: 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
f530: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
f540: 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
f550: 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
f560: 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
f570: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
f580: 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
f590: 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
f5a0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
f5b0: 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
f5c0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
f5d0: 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
f5e0: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
f5f0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
f600: 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
f610: 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
f620: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f630: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f640: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f660: 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
f670: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
f680: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f690: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f6a0: 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
f6b0: 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
f6c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f6d0: 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
f6e0: 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
f6f0: 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
f700: 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
f710: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
f720: 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
f730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f740: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
f750: 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
f760: 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
f770: 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
f780: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f790: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
f7a0: 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
f7b0: 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
f7c0: 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
f7d0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
f7e0: 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
f7f0: 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
f800: 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
f810: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
f820: 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
f830: 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
f840: 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
f850: 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
f860: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
f870: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
f880: 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
f890: 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
f8a0: 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
f8b0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
f8c0: 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
f8d0: 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
f8e0: 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
f8f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
f900: 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
f910: 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
f920: 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
f930: 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
f940: 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
f950: 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
f960: 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
f970: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
f980: 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
f990: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
f9a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
f9b0: 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
f9c0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
f9d0: 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
f9e0: 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
f9f0: 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
fa00: 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
fa10: 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
fa20: 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
fa30: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
fa40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
fa50: 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
fa60: 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
fa70: 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
fa80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fa90: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
faa0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
fab0: 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
fac0: 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
fad0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
fae0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
faf0: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
fb00: 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
fb10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
fb20: 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
fb30: 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
fb40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fb50: 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
fb60: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fb70: 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e   iLastPg = pBt->
fb80: 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c  nTrunc;.  if( iL
fb90: 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  astPg==0 ){.    
fba0: 69 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74 65  iLastPg = sqlite
fbb0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
fbc0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
fbd0: 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
fbe0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
fbf0: 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
fc00: 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
fc10: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
fc20: 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
fc30: 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
fc40: 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
fc50: 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
fc60: 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
fc70: 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
fc80: 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
fc90: 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
fca0: 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
fcb0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fcc0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
fcd0: 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
fce0: 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
fcf0: 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
fd00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fd10: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
fd20: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
fd30: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
fd40: 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
fd50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fd60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
fd70: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
fd80: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
fd90: 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
fda0: 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
fdb0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
fdc0: 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
fdd0: 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
fde0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
fdf0: 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
fe00: 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
fe10: 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
fe20: 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
fe30: 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
fe40: 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
fe50: 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
fe60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
fe70: 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
fe80: 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
fe90: 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
fea0: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
feb0: 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
fec0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
fed0: 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
fee0: 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
fef0: 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
ff00: 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
ff10: 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
ff20: 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
ff30: 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
ff40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
ff50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ff60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ff70: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
ff80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
ff90: 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
ffa0: 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
ffb0: 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
ffc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
ffd0: 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
ffe0: 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
fff0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10000 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
10010 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
10020 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
10030 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
10040 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10050 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
10060 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
10070 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
10080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
100a0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
100b0 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
100c0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
100d0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
100e0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
100f0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
10100 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
10110 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
10120 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
10130 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
10140 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
10150 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
10160 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
10170 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
10180 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
10190 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
101a0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
101b0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
101c0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
101d0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
101e0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
101f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
10200 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
10210 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
10220 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
10230 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
10240 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
10250 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10280 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
10290 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
102a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
102b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
102c0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
102d0 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
102e0 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
102f0 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
10300 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10310 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
10320 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
10330 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10340 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
10350 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
10360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10370 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10380 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20  c;.      } .    
10390 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
103a0 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
103b0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
103c0 65 2c 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20  e, iFreePg);.   
103d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
103e0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
103f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10400 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10410 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a  rn rc;.      } .
10420 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74      }.  }..  pBt
10430 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74  ->nTrunc = iLast
10440 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  Pg - 1;.  while(
10450 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45   pBt->nTrunc==PE
10460 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
10470 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
10480 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54  AGE(pBt, pBt->nT
10490 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74  runc) ){.    pBt
104a0 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a  ->nTrunc--;.  }.
104b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
104c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
104d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
104e0 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
104f0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
10500 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
10510 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
10520 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
10530 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
10540 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
10550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
10560 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
10570 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
10580 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
10590 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
105a0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
105b0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
105c0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
105d0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
105e0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
105f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
10600 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
10610 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
10620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10630 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
10640 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
10650 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
10660 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
10670 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10680 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
10690 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
106a0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
106b0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
106c0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
106d0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
106e0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
106f0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
10700 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
10710 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
10720 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
10730 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
10740 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a  ep(pBt, 0);.  }.
10750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10760 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10770 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10780 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10790 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
107a0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
107b0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
107c0 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
107d0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
107e0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
107f0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
10800 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
10810 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
10820 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
10830 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
10840 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10850 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
10860 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
10870 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
10880 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
10890 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
108a0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
108b0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
108c0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
108d0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
108e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
108f0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
10900 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
10910 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b   Pgno *pnTrunc){
10920 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10930 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
10940 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
10950 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ager;.#ifndef ND
10960 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
10970 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
10980 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
10990 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
109a0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
109b0 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74  texHeld(pBt->mut
109c0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
109d0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
109e0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
109f0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
10a00 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
10a10 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
10a20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30     Pgno nFin = 0
10a30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ;..    if( pBt->
10a40 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20  nTrunc==0 ){.   
10a50 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20     Pgno nFree;. 
10a60 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61       Pgno nPtrma
10a70 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  p;.      const i
10a80 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70  nt pgsz = pBt->p
10a90 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 50  ageSize;.      P
10aa0 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69  gno nOrig = sqli
10ab0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
10ac0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
10ad0 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41  .      if( PTRMA
10ae0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
10af0 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rig) ){.        
10b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10b10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10b20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4f    }.      if( nO
10b30 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
10b40 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
10b50 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a         nOrig--;.
10b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
10b70 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
10b80 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
10b90 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e  ta[36]);.      n
10ba0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
10bb0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
10bc0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
10bd0 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29  pgsz/5)/(pgsz/5)
10be0 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e  ;.      nFin = n
10bf0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
10c00 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  Ptrmap;.      if
10c10 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
10c20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
10c30 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f  & nFin<=PENDING_
10c40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
10c50 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d  {.        nFin--
10c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10c70 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
10c80 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
10c90 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
10ca0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
10cb0 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d  ){.        nFin-
10cc0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
10cd0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
10ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10cf0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
10d00 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
10d10 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
10d20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
10d30 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E ){.      asser
10d40 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74  t(nFin==0 || pBt
10d50 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e  ->nTrunc==0 || n
10d60 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63  Fin<=pBt->nTrunc
10d70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
10d80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
10d90 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29  f( pBt->nTrunc )
10da0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10db0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10dc0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
10dd0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
10de0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
10df0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
10e00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
10e10 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
10e20 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
10e30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
10e40 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a  >nTrunc = nFin;.
10e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10e60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
10e80 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
10e90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
10ea0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
10eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ec0 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d   *pnTrunc = pBt-
10ed0 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74  >nTrunc;.    pBt
10ee0 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  ->nTrunc = 0;.  
10ef0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  }.  assert( nRef
10f00 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ==sqlite3PagerRe
10f10 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
10f20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10f30 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ..#endif../*.** 
10f40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
10f50 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
10f60 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
10f70 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
10f80 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
10f90 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
10fa0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
10fb0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
10fc0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
10fd0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
10fe0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
10ff0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
11000 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
11010 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
11020 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
11030 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
11040 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
11050 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
11060 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
11070 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
11080 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
11090 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
110a0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
110b0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
110c0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
110d0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
110e0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
110f0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
11100 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
11110 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
11120 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
11130 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
11140 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
11150 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11160 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
11170 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
11180 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
11190 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
111a0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
111b0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
111c0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
111d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
111e0 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  t() for the seco
111f0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
11200 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
11210 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
11220 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
11230 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
11240 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
11250 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
11260 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
11270 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
11280 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
11290 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
112a0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
112b0 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
112c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
112d0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
112e0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
112f0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
11300 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
11310 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
11320 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
11330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
11340 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
11350 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
11360 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
11370 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11380 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
11390 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
113a0 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
113b0 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
113c0 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
113d0 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
113e0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
113f0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
11400 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
11410 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
11420 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
11430 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
11440 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11450 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
11460 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
11470 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
11480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11490 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
114a0 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
114b0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
114c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
114d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
114e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
114f0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
11500 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11510 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  >pBt;.    Pgno n
11520 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73  Trunc = 0;.    s
11530 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11540 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
11550 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11560 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
11570 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
11580 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
11590 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20  cuumCommit(pBt, 
115a0 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20  &nTrunc); .     
115b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
115c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
115d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
115e0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
115f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
11600 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11610 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11620 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
11630 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
11640 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ster, nTrunc);. 
11650 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11660 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
11670 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11680 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
11690 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
116a0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
116b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
116c0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
116d0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
116e0 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
116f0 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
11700 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
11710 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
11720 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
11730 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
11740 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  ed.** prior to c
11750 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
11760 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
11770 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
11780 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20  tine did.** all 
11790 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
117a0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
117b0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
117c0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
117d0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
117e0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
117f0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
11800 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
11810 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
11820 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
11830 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
11840 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
11850 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75  al.** (which cau
11860 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
11870 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
11880 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  nd drop locks..*
11890 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
118a0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
118b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
118c0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
118d0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
118e0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
118f0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
11900 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
11910 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11920 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
11930 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  o(Btree *p){.  B
11940 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11950 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
11960 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11970 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
11980 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
11990 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
119a0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
119b0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
119c0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
119d0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
119e0 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
119f0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
11a00 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
11a10 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
11a20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
11a30 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
11a40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
11a50 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
11a60 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
11a70 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
11a80 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
11a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11aa0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
11ab0 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
11ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11ae0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11af0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
11b00 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
11b10 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11b20 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
11b30 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
11b40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f   = 0;.  }.  unlo
11b50 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a  ckAllTables(p);.
11b60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
11b70 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64  dle has any kind
11b80 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
11b90 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
11ba0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
11bb0 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68    ** count of th
11bc0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
11bd0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
11be0 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  on count reaches
11bf0 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65   0, set.  ** the
11c00 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
11c10 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
11c20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
11c30 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f  used() call belo
11c40 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f  w.  ** will unlo
11c50 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  ck the pager..  
11c60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
11c70 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
11c80 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  ){.    pBt->nTra
11c90 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
11ca0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
11cb0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
11cc0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
11cd0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
11ce0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11cf0 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c  /* Set the handl
11d00 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  es current trans
11d10 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
11d20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
11d30 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70  nlock.  ** the p
11d40 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
11d50 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
11d60 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
11d70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
11d80 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  /.  p->inTrans =
11d90 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75   TRANS_NONE;.  u
11da0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11db0 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
11dc0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
11dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11de0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11e00 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
11e10 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
11e20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11e30 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
11e40 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
11e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11e60 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
11e70 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11e80 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
11e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
11eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11ec0 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20  itPhaseTwo(p);. 
11ed0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
11ee0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11ef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
11f00 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
11f10 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
11f20 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
11f30 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
11f40 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
11f50 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
11f60 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
11f70 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
11f80 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
11f90 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
11fa0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
11fb0 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
11fc0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
11fd0 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
11fe0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
11ff0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
12000 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
12010 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
12020 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
12030 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 20   pCur->wrFlag ) 
12040 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
12050 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
12060 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
12070 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
12080 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c  n progress.  All
12090 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
120a0 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79  .** invalided by
120b0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
120c0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
120d0 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a   use a cursor.**
120e0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
120f0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
12100 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
12110 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  n will result.**
12120 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
12130 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
12140 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
12150 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12160 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
12170 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
12180 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
12190 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
121a0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
121b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
121c0 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
121d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
121e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
121f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
12200 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
12210 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12220 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76  r(p);.  rc = sav
12230 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
12240 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
12250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12260 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72  ED_CACHE.  if( r
12270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12280 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
12290 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74   horrible situat
122a0 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61  ion. An IO or ma
122b0 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
122c0 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  ured whilst.    
122d0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
122e0 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
122f0 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
12300 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
12310 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
12320 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
12330 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
12340 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
12350 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
12360 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
12370 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
12380 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
12390 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
123a0 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
123b0 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
123c0 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
123d0 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
123e0 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
123f0 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
12400 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
12410 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
12420 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
12430 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
12440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
12450 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  le( pBt->pCursor
12460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12470 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43 75  3 *db = pBt->pCu
12480 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53  rsor->pBtree->pS
12490 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28  qlite;.      if(
124a0 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73   db ){.        s
124b0 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72  qlite3AbortOther
124c0 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20  ActiveVdbes(db, 
124d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
124e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  }.  }.#endif.  b
124f0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
12500 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  ;.  unlockAllTab
12510 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  les(p);..  if( p
12520 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
12530 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
12540 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20  t rc2;..#ifndef 
12550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12560 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
12570 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64  nTrunc = 0;.#end
12580 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
12590 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
125a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
125b0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
125c0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
125d0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
125e0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
125f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12600 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
12610 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
12620 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
12630 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
12640 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
12650 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
12660 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12670 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
12680 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
12690 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
126a0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
126b0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
126c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
126d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
126e0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
126f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12700 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
12710 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
12720 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
12730 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
12740 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
12750 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
12760 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
12770 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12780 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
12790 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
127a0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
127b0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
127c0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
127d0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
127e0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
127f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
12800 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
12810 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12820 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
12830 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e  NS_NONE;.  pBt->
12840 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e  inStmt = 0;.  un
12850 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
12860 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
12870 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
12880 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12890 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
128a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
128b0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
128c0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54  btransaction.  T
128d0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
128e0 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  n can.** can be 
128f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65  rolled back inde
12900 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
12910 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
12920 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73  n..** You must s
12930 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
12940 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  on before starti
12950 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
12960 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74  ion..** The subt
12970 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
12980 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
12990 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y if the main tr
129a0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d  ansaction.** com
129b0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
129c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f  ck..**.** Only o
129d0 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ne subtransactio
129e0 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20  n may be active 
129f0 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69  at a time.  It i
12a00 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72  s an error to tr
12a10 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20  y.** to start a 
12a20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69  new subtransacti
12a30 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75  on if another su
12a40 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
12a50 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
12a60 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
12a70 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
12a80 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
12a90 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
12aa0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
12ab0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
12ac0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
12ad0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
12ae0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
12af0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
12b00 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
12b10 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
12b20 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
12b30 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
12b40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
12b50 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
12b60 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
12b70 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
12b80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12b90 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
12ba0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
12bb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12bc0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
12bd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12be0 70 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e  p);.  if( (p->in
12bf0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
12c00 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74  TE) || pBt->inSt
12c10 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  mt ){.    rc = p
12c20 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
12c30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
12c40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
12c60 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
12c70 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
12c80 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ITE );.    rc = 
12c90 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
12ca0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
12cb0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
12cc0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  n(pBt->pPager);.
12cd0 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
12ce0 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
12cf0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12d00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12d10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
12d20 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
12d30 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
12d40 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
12d50 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
12d60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
12d70 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
12d80 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
12d90 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12da0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
12db0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
12dc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12dd0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
12de0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
12df0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
12e00 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
12e10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12e20 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
12e30 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  it(pBt->pPager);
12e40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12e50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12e60 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  }.  pBt->inStmt 
12e70 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
12e80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12ea0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
12eb0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
12ec0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
12ed0 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
12ee0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
12ef0 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
12f00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
12f10 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
12f20 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
12f30 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
12f40 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
12f50 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
12f60 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
12f70 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
12f80 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
12f90 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
12fa0 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
12fb0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
12fc0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
12fd0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
12fe0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12ff0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
13000 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13010 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13020 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  r(p);.  sqlite3M
13030 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b  allocDisallow();
13040 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
13050 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
13060 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
13070 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13080 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
13090 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
130a0 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
130b0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
130c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
130d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
130e0 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29  te3MallocAllow()
130f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13100 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13110 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13120 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70  Default key comp
13130 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
13140 74 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f  to be used if no
13150 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
13160 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69  tion.** is speci
13170 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69  fied on the sqli
13180 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
13190 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
131a0 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65   int dfltCompare
131b0 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
131c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
131d0 2a 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e  * User data is n
131e0 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
131f0 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   n1, const void 
13200 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  *p1,    /* First
13210 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
13220 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e  */.  int n2, con
13230 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20  st void *p2     
13240 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f  /* Second key to
13250 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20   compare */.){. 
13260 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65   int c;.  c = me
13270 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c  mcmp(p1, p2, n1<
13280 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20  n2 ? n1 : n2);. 
13290 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
132a0 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
132b0 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
132c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
132d0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
132e0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
132f0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
13300 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
13310 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
13320 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
13330 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
13340 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
13350 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
13360 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
13370 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
13380 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
13390 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
133a0 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
133b0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
133c0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
133d0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
133e0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
133f0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
13400 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
13410 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
13420 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
13430 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
13440 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
13450 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
13460 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
13470 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
13480 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
13490 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
134a0 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
134b0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
134c0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
134d0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
134e0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
134f0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
13500 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
13510 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
13520 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
13530 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
13540 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
13550 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
13560 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
13570 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
13580 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
13590 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
135a0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
135b0 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
135c0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
135d0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
135e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
135f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
13600 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
13610 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
13620 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
13630 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
13640 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
13650 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
13660 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
13670 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13680 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
13690 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
136a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
136b0 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
136c0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
136d0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
136e0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
136f0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
13700 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
13710 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
13720 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73   logically the s
13730 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ame for every cu
13740 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72  rsor.** on a par
13750 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
13760 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d  Changing the com
13770 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13780 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
13790 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65  in incorrect ope
137a0 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  rations.  If the
137b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
137c0 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a  tion is NULL, a.
137d0 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61  ** default compa
137e0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
137f0 73 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d  s used.  The com
13800 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13810 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67   is.** always ig
13820 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59  nored for INTKEY
13830 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
13840 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
13850 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
13890 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
138d0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
138e0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13910 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
13920 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
13930 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
13940 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13950 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13960 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
13970 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
13980 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
139b0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
139c0 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
139d0 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
13a00 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
13a10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
13a20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
13a30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13a40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
13a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
13a60 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74  reeMutexHeld(pBt
13a70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2a 70  ->mutex) );.  *p
13a80 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  pCur = 0;.  if( 
13a90 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  wrFlag ){.    if
13aa0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
13ab0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13ac0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
13ad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
13ae0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
13af0 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
13b00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13b10 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  TE_LOCKED;.    }
13b20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d  .  }..  if( pBt-
13b30 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
13b40 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
13b50 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20  WithRetry(p);.  
13b60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
13b80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13b90 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
13ba0 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b  nly && wrFlag ){
13bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13bc0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20     }.  }.  pCur 
13be0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13bf0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  ero( sizeof(*pCu
13c00 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
13c10 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
13c20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13c30 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
13c40 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
13c50 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
13c60 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
13c70 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
13c80 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50  e==1 && sqlite3P
13c90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
13ca0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  t->pPager)==0 ){
13cb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13cc0 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
13cd0 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
13ce0 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
13cf0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
13d00 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
13d10 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
13d20 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
13d30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13d40 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
13d50 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
13d60 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
13d70 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
13d80 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
13d90 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
13da0 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
13db0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
13dc0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
13dd0 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
13de0 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
13df0 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
13e00 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
13e10 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
13e20 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
13e30 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
13e40 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
13e50 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
13e60 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43  Arg = pArg;.  pC
13e70 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
13e80 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
13e90 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
13ea0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
13eb0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
13ec0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
13ed0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
13ee0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
13ef0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
13f00 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
13f10 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
13f20 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72 20  VALID;.  *ppCur 
13f30 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75 72  = pCur;..  retur
13f40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72  n SQLITE_OK;..cr
13f50 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
13f60 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75  ption:.  if( pCu
13f70 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  r ){.    release
13f80 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
13f90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13fa0 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ree(pCur);.  }. 
13fb0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13fc0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
13fd0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
13fe0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
13ff0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14030 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14060 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
14070 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
14080 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
140b0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
140c0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ad-only */.  int
140d0 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69   (*xCmp)(void*,i
140e0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
140f0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
14100 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73   /* Key Comparis
14110 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69  on func */.  voi
14120 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  d *pArg,        
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
14150 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
14160 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
14170 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20  r **ppCur       
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
141a0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
141b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
141c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
141d0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
141e0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
141f0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 78 43 6d 70  le, wrFlag, xCmp
14200 2c 20 70 41 72 67 2c 20 70 70 43 75 72 29 3b 0a  , pArg, ppCur);.
14210 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14220 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14230 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
14240 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
14250 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
14260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14270 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
14280 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
14290 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
142a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
142b0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
142c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
142d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
142e0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
142f0 2d 3e 70 42 74 3b 0a 0a 20 20 63 75 72 73 6f 72  ->pBt;..  cursor
14300 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20 20 63  Enter(pCur);.  c
14310 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
14320 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
14330 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
14340 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
14350 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
14360 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
14370 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14380 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
14390 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  }.  if( pCur->pN
143a0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
143b0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
143c0 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  pCur->pPrev;.  }
143d0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
143e0 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75  Cur->pPage);.  u
143f0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14400 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76 61 6c  ed(pBt);.  inval
14410 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
14420 68 65 28 70 43 75 72 29 3b 0a 20 20 63 75 72 73  he(pCur);.  curs
14430 6f 72 4c 65 61 76 65 28 70 43 75 72 29 3b 0a 20  orLeave(pCur);. 
14440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
14450 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
14460 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14470 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61  * Make a tempora
14480 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c  ry cursor by fil
14490 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c  ling in the fiel
144a0 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a  ds of pTempCur..
144b0 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ** The temporary
144c0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f   cursor is not o
144d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73  n the cursor lis
144e0 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e  t for the Btree.
144f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14500 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
14510 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
14520 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65  r, BtCursor *pTe
14530 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79  mpCur){.  memcpy
14540 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c  (pTempCur, pCur,
14550 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b   sizeof(*pCur));
14560 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65  .  pTempCur->pNe
14570 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43  xt = 0;.  pTempC
14580 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  ur->pPrev = 0;. 
14590 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70   if( pTempCur->p
145a0 50 61 67 65 20 29 7b 0a 20 20 20 20 63 75 72 73  Page ){.    curs
145b0 6f 72 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20  orEnter(pCur);. 
145c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
145d0 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
145e0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
145f0 20 20 63 75 72 73 6f 72 4c 65 61 76 65 28 70 43    cursorLeave(pC
14600 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
14610 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
14620 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
14630 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
14640 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
14650 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
14660 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
14670 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
14680 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
14690 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
146a0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
146b0 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 63  ->pPage ){.    c
146c0 75 72 73 6f 72 45 6e 74 65 72 28 70 43 75 72 29  ursorEnter(pCur)
146d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
146e0 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
146f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
14700 20 20 20 63 75 72 73 6f 72 4c 65 61 76 65 28 70     cursorLeave(p
14710 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
14720 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14730 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
14740 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
14750 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
14760 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
14770 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
14780 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
14790 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
147a0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
147b0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
147c0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
147d0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
147e0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
147f0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
14800 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
14810 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
14820 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
14830 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
14840 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
14850 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
14860 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
14870 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
14880 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
14890 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
148a0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
148b0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
148c0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
148d0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
148e0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
148f0 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
14900 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
14910 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
14920 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
14930 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
14940 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
14950 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
14960 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
14970 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
14980 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
14990 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
149a0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
149b0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
149c0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
149d0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
149e0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
149f0 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
14a00 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
14a10 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
14a20 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
14a30 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
14a40 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d  Info info;.    m
14a50 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
14a60 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
14a70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
14a80 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
14a90 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
14aa0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
14ab0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
14ac0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
14ad0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
14ae0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
14af0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
14b00 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
14b10 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
14b20 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
14b30 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
14b40 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
14b50 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
14b60 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
14b70 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
14b80 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
14b90 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
14ba0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
14bb0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14bc0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
14bd0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
14be0 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
14bf0 69 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  info);.    }else
14c00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
14c10 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
14c20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
14c30 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
14c40 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
14c50 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
14c60 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
14c70 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
14c80 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
14c90 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
14ca0 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
14ce0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
14cf0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
14d30 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
14d40 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
14d50 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
14d60 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d  );         \.  }
14d70 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 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 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
14dc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c                 \
14e00 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
14e10 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
14e20 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
14e30 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
14e40 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
14e50 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
14e60 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
14e70 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
14e80 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
14e90 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
14ea0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
14eb0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
14ec0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
14ed0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
14ee0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
14ef0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
14f00 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
14f10 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
14f20 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
14f30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
14f40 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
14f50 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
14f60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
14f70 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
14f80 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74  int rc;..  sqlit
14f90 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75  e3BtreeEnter(pCu
14fa0 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63  r->pBtree);.  rc
14fb0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
14fc0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
14fd0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
14fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14ff0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
15000 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15010 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
15020 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
15030 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
15040 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15050 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
15060 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
15070 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15080 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
15090 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
150a0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
150b0 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
150c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
150d0 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
150e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
150f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
15100 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
15110 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
15120 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
15130 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
15140 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
15150 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  o.  Always retur
15160 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
15170 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
15180 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65  ossible.  If the
15190 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63   cursor is not c
151a0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
151b0 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
151c0 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70   (which can happ
151d0 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
151e0 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   if.** the datab
151f0 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68  ase is empty) th
15200 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  en *pSize is set
15210 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
15220 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
15230 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
15240 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
15250 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c    int rc;..  sql
15260 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15270 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
15280 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
15290 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
152a0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
152b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
152c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
152d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
152e0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
152f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
15300 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
15310 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
15320 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
15330 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
15340 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
15350 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
15360 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
15370 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15390 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
153a0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
153b0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
153c0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
153d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
153e0 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
153f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15400 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
15410 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15420 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
15430 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
15440 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
15450 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
15460 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
15470 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15480 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15490 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
154a0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
154b0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
154c0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
154d0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
154e0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
154f0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
15500 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
15510 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
15520 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
15530 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
15540 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
15550 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15560 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
15570 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e  ** Unless pPgnoN
15580 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
15590 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
155a0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
155b0 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  w .** page in th
155c0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
155d0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
155e0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
155f0 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c  ovfl.** is the l
15600 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 27 73  ast page in it's
15610 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70   linked list, *p
15620 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
15630 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
15640 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
15650 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69   NULL, *ppPage i
15660 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d  s set to the Mem
15670 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20  Page* handle.** 
15680 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54  for page ovfl. T
15690 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61  he underlying pa
156a0 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61 76  ger page may hav
156b0 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
156c0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43  .** with the noC
156d0 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c  ontent flag set,
156e0 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   so the page dat
156f0 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69 61  a accessable via
15700 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20  .** this handle 
15710 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
15720 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15730 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
15740 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
15750 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  Bt, .  Pgno ovfl
15760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15770 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
15780 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
15790 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
157a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
157b0 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f  emPage handle */
157c0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
157d0 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
157e0 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
157f0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
15800 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
15810 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ext = 0;.  int r
15820 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
15830 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
15840 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
15850 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  );.  /* One of t
15860 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  hese must not be
15870 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
15880 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20  , why call this 
15890 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61  function? */.  a
158a0 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20  ssert(ppPage || 
158b0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f  pPgnoNext);..  /
158c0 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69  * If pPgnoNext i
158d0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
158e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
158f0 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62  ing called to ob
15900 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50  tain.  ** a MemP
15910 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f  age* reference o
15920 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74  nly. No page-dat
15930 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  a is required in
15940 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f   this case..  */
15950 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78  .  if( !pPgnoNex
15960 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
15970 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
15980 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70  age(pBt, ovfl, p
15990 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a  pPage, 1);.  }..
159a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
159b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
159c0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
159d0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
159e0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
159f0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
15a00 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
15a10 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
15a20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
15a30 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
15a40 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
15a50 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
15a60 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
15a70 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
15a80 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
15a90 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
15aa0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
15ab0 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
15ac0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
15ad0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
15ae0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
15af0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
15b00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
15b10 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
15b20 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
15b30 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
15b40 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
15b50 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
15b60 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
15b70 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
15b80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
15b90 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
15ba0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
15bb0 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74  f( iGuess<=sqlit
15bc0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
15bd0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
15be0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
15bf0 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
15c00 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
15c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15c50 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
15c60 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
15c70 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
15c80 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
15c90 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
15ca0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
15cb0 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70  f( next==0 || pp
15cc0 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50  Page ){.    MemP
15cd0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
15ce0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15cf0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
15d00 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
15d10 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61   next!=0);.    a
15d20 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
15d30 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29  _OK || pPage==0)
15d40 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d  ;.    if( next==
15d50 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
15d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
15d70 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
15d80 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
15d90 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65  ..    if( ppPage
15da0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
15db0 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d  e = pPage;.    }
15dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65  else{.      rele
15dd0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
15de0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67      }.  }.  *pPg
15df0 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a  noNext = next;..
15e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15e10 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
15e20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
15e30 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
15e40 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
15e50 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
15e60 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
15e70 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
15e80 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
15e90 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
15ea0 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
15eb0 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
15ec0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
15ed0 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
15ee0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
15ef0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
15f00 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
15f10 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
15f20 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
15f30 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
15f40 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
15f50 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
15f60 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
15f70 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
15f80 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
15f90 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
15fa0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15fb0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
15fc0 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
15fd0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
15fe0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
15ff0 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
16000 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
16010 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
16020 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
16030 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
16040 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16050 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
16060 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
16070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16080 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
16090 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
160a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
160b0 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
160c0 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
160d0 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
160e0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
160f0 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
16100 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
16110 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
16120 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
16130 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
16140 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
16150 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
16160 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
16170 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16180 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
16190 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
161a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
161b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
161c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
161d0 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
161e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
161f0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
16200 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
16210 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
16220 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
16230 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
16240 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
16250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16260 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
16270 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
16280 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
16290 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
162a0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
162b0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
162c0 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
162d0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
162e0 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70   If the eOp.** p
162f0 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
16300 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
16310 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f  eration (data co
16320 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66  pied into.** buf
16330 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74  fer pBuf). If it
16340 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20   is non-zero, a 
16350 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69  write (data copi
16360 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65  ed from.** buffe
16370 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41  r pBuf)..**.** A
16380 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
16390 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f  bytes are read o
163a0 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e  r written beginn
163b0 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ing at "offset".
163c0 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64  .** Data is read
163d0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
163e0 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
163f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16400 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
16410 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77  distinction betw
16420 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61  een key and data
16430 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61  ..** It just rea
16440 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74  ds or writes byt
16450 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c  es from the payl
16460 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20  oad area.  Data 
16470 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72  might .** appear
16480 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
16490 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  e or be scattere
164a0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
164b0 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70  e overflow .** p
164c0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ages..**.** If t
164d0 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e  he BtCursor.isIn
164e0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
164f0 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68  g is set, and th
16500 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72  e current.** cur
16510 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
16520 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
16530 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20  low pages, this 
16540 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
16550 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20  cates space for 
16560 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75  and lazily poplu
16570 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
16580 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20  w page-list .** 
16590 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
165a0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
165b0 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  . Subsequent cal
165c0 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63  ls use this.** c
165d0 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
165e0 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
165f0 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65  lied offset more
16600 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
16610 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
16620 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
16630 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
16640 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
16650 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
16660 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
16670 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
16680 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
16690 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
166a0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
166b0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
166c0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
166d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
166e0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
166f0 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
16700 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
16710 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
16720 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
16730 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
16740 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
16750 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
16760 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
16770 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
16780 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
16790 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
167a0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
167b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
167c0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
167d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
167e0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
167f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
16800 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
16810 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c  */.  int offset,
16820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
16830 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
16840 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
16850 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
16860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16870 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
16880 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
16890 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
168a0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
168b0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
168c0 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b   */ .  int skipK
168d0 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  ey,         /* o
168e0 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20  ffset begins at 
168f0 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
16900 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  true */.  int eO
16910 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
16920 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
16930 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
16940 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
16950 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
16960 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
16970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20  QLITE_OK;.  u32 
16980 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78  nKey;.  int iIdx
16990 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
169a0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
169b0 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Page;        /* 
169c0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
169d0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
169e0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
169f0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
16a00 74 72 65 65 2d 3e 70 42 74 3b 20 20 20 2f 2a 20  tree->pBt;   /* 
16a10 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
16a20 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
16a30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
16a50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16a60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
16a70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
16a80 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
16a90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
16aa0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
16ab0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
16ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
16ad0 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  exHeld(pCur->pBt
16ae0 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  ree->pBt->mutex)
16af0 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
16b00 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
16b10 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
16b20 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
16b30 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
16b40 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
16b50 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72  ntKey ? 0 : pCur
16b60 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
16b70 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
16b80 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
16b90 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
16ba0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
16bb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
16bc0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
16bd0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
16be0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
16bf0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
16c00 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
16c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16c20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  OR;.  }..  /* Ch
16c30 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
16c40 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
16c50 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
16c60 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
16c70 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
16c80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
16c90 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
16ca0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
16cb0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
16cc0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
16cd0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
16ce0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
16cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
16d00 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
16d10 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
16d20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
16d30 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
16d40 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
16d50 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
16d60 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
16d70 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
16d80 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
16d90 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
16da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16db0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
16dc0 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a  onst int ovflSiz
16dd0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
16de0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
16df0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
16e00 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
16e10 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
16e20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
16e30 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
16e40 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
16e50 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
16e60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
16e70 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
16e80 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
16e90 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
16ea0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
16eb0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
16ec0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
16ed0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
16ee0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
16ef0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
16f00 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
16f10 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
16f20 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
16f30 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
16f40 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
16f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16f60 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
16f70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
16f80 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
16f90 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
16fa0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
16fb0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
16fc0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
16fd0 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
16fe0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
16ff0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
17000 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
17010 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
17020 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
17030 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
17040 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
17050 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
17060 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
17070 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
17080 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
17090 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
170a0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
170b0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
170c0 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
170d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
170e0 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
170f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
17100 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
17110 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
17120 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
17130 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17140 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
17150 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
17160 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
17170 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
17180 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
17190 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
171a0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
171b0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
171c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
171d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
171e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
171f0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
17200 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
17210 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
17220 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
17230 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
17240 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
17250 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
17260 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
17270 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
17280 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
17290 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
172a0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
172b0 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
172c0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
172d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
172e0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
172f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17300 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
17310 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
17320 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
17330 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
17340 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
17350 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
17360 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
17370 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
17380 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
17390 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
173a0 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
173b0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
173c0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
173d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
173e0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
173f0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
17400 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
17410 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
17420 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
17430 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
17440 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
17450 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
17460 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
17470 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
17480 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
17490 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
174a0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
174b0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
174c0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
174d0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
174e0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
174f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
17500 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
17510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
17520 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
17530 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
17540 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
17550 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
17560 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
17570 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
17580 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
17590 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
175a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
175b0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
175c0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
175d0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
175e0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
175f0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
17600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17610 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
17620 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
17630 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
17640 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
17650 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
17660 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
17670 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
17680 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
17690 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
176a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
176b0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
176c0 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
176d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
176e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
176f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
17700 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
17710 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
17720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17730 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
17740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
17750 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
17760 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
17770 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
17780 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
17790 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
177a0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
177b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
177c0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
177d0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
177e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
177f0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
17800 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
17810 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
17820 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
17830 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
17840 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
17850 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
17860 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
17870 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
17880 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
17890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
178a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
178b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
178c0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
178d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
178e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
178f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17900 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
17910 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
17920 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
17930 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
17940 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
17950 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
17960 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
17970 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
17980 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
17990 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
179a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
179b0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
179c0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
179d0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
179e0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
179f0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
17a00 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
17a10 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
17a20 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
17a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17a40 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
17a50 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
17a60 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
17a70 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
17a80 63 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c;..  sqlite3Btr
17a90 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
17aa0 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 72 65  tree);.  rc = re
17ab0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
17ac0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
17ad0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
17af0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
17b00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
17b10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17b20 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
17b30 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
17b40 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
17b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
17b60 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
17b70 74 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74  tree);.      ret
17b80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17b90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
17ba0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
17bb0 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  >pPage->intKey==
17bc0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17bd0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
17be0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
17bf0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
17c00 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
17c10 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
17c20 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
17c30 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
17c40 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   0, 0);.  }.  sq
17c50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17c60 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20  pCur->pBtree);. 
17c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17c80 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
17c90 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
17ca0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
17cb0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
17cc0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
17cd0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
17ce0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
17cf0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
17d00 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
17d10 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
17d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
17d30 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
17d40 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
17d50 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
17d60 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
17d70 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
17d80 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
17d90 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
17da0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
17db0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17dc0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
17dd0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
17de0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
17df0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
17e00 74 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65 33  t rc;..  sqlite3
17e10 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72 2d  BtreeEnter(pCur-
17e20 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20 3d  >pBtree);.  rc =
17e30 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
17e40 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
17e50 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
17e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17e70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
17e80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17e90 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
17ea0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  ( pCur->pPage!=0
17eb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17ec0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
17ed0 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
17ee0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
17ef0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
17f00 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
17f10 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
17f20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  1, 0);.  }.  sql
17f30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17f40 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
17f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17f60 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
17f70 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
17f80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
17f90 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
17fa0 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
17fb0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
17fc0 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
17fd0 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
17fe0 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
17ff0 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
18000 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
18010 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
18020 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
18030 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
18040 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18050 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
18060 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
18070 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
18080 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
18090 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
180a0 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
180b0 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
180c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
180d0 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
180e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
180f0 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
18100 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
18110 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
18120 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
18130 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
18140 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
18150 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
18160 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
18170 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
18180 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
18190 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
181a0 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
181b0 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
181c0 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
181d0 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
181e0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
181f0 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
18200 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
18210 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
18220 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  ly.** the key/da
18230 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
18240 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
18250 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
18260 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
18270 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
18280 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
18290 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
182a0 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
182b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
182c0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
182d0 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
182e0 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
182f0 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
18300 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
18310 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
18320 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
18330 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
18340 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
18350 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
18360 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
18370 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
18380 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
18390 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
183a0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
183b0 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
183c0 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
183d0 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
183e0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
183f0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
18400 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
18410 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
18420 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
18430 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
18440 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  int nLocal;..
18450 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
18460 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
18470 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18480 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
18490 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
184a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
184b0 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
184c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
184d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
184e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
184f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  e;.  assert( pCu
18500 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
18510 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
18520 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
18530 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
18540 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
18550 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
18560 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
18570 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
18580 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
18590 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
185a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
185b0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
185c0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
185d0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
185e0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
185f0 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
18600 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18610 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
18620 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
18630 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18640 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
18650 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
18660 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
18670 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
18680 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
18690 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
186a0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
186b0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
186c0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
186d0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
186e0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
186f0 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
18700 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
18710 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
18720 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
18730 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
18740 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
18750 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
18760 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
18770 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
18780 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
18790 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
187a0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
187b0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
187c0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
187d0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
187e0 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
187f0 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
18800 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
18810 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
18820 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
18830 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
18840 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
18850 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
18860 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
18870 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
18880 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
18890 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
188a0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
188b0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
188c0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
188d0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
188e0 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
188f0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
18900 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
18910 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
18920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18930 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
18940 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
18950 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18960 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
18970 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
18990 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
189a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
189b0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
189c0 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
189d0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
189e0 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
189f0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
18a00 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28  pAmt){.  assert(
18a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
18a20 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  exHeld(pCur->pBt
18a30 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  ree->pBt->mutex)
18a40 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
18a50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18a60 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
18a70 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
18a80 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
18a90 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
18aa0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18ab0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
18ac0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
18ad0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
18ae0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
18af0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
18b00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
18b10 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
18b20 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74  o move to..*/.st
18b30 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
18b40 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
18b50 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
18b60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
18b70 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
18b80 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c  ;.  MemPage *pOl
18b90 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  dPage;.  BtShare
18ba0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
18bb0 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61  Btree->pBt;..  a
18bc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
18bd0 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 42 74  reeMutexHeld(pBt
18be0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
18bf0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18c00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18c10 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
18c20 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
18c30 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
18c40 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
18c50 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18c60 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
18c70 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
18c80 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
18c90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
18ca0 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
18cb0 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
18cc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
18cd0 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
18ce0 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
18cf0 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
18d00 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
18d10 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
18d20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
18d30 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
18d40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18d50 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
18d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18d70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
18d80 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
18d90 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
18da0 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
18db0 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
18dc0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
18dd0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
18de0 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
18df0 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
18e00 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
18e10 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
18e20 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
18e30 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
18e40 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
18e50 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
18e60 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
18e70 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
18e80 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
18e90 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
18ea0 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
18eb0 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
18ec0 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
18ed0 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
18ee0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
18ef0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18f00 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
18f10 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
18f20 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70  texHeld(pPage->p
18f30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18f40 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
18f50 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20  >pParent;.  if( 
18f60 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65 74  pParent==0 ) ret
18f70 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 61  urn 1;.  if( pPa
18f80 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72  rent->pgno>1 ) r
18f90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 67  eturn 0;.  if( g
18fa0 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e 74  et2byte(&pParent
18fb0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
18fc0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
18fd0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
18fe0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18ff0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
19000 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
19010 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
19020 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
19030 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
19040 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
19050 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
19060 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
19070 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
19080 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
19090 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
190a0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
190b0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
190c0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
190d0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
190e0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
190f0 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
19100 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
19110 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
19120 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
19130 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65  e *pParent;.  Me
19140 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
19150 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a  int idxParent;..
19160 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19170 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ter(pCur->pBtree
19180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19190 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
191a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61  R_VALID );.  pPa
191b0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
191c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
191d0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
191e0 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  ( !sqlite3BtreeI
191f0 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
19200 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20   );.  pParent = 
19210 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
19220 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
19230 74 21 3d 30 20 29 3b 0a 20 20 69 64 78 50 61 72  t!=0 );.  idxPar
19240 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  ent = pPage->idx
19250 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
19260 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
19270 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 72  t->pDbPage);.  r
19280 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
19290 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  );.  pCur->pPage
192a0 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43   = pParent;.  pC
192b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
192c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
192d0 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d  arent->idxShift=
192e0 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64  =0 );.  pCur->id
192f0 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 20  x = idxParent;. 
19300 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19310 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29  ve(pCur->pBtree)
19320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
19330 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
19340 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73  e root page.*/.s
19350 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19360 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
19370 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
19380 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
19390 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
193a0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
193b0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
193c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
193d0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
193e0 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
193f0 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e  eld(p->pSqlite->
19400 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19410 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
19420 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d  MutexHeld(pBt->m
19430 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
19440 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19450 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
19460 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73  ){.    clearCurs
19470 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19480 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
19490 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
194a0 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f  f( pRoot && pRoo
194b0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
194c0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61  gnoRoot ){.    a
194d0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
194e0 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  Init );.  }else{
194f0 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
19500 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
19510 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
19520 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
19530 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29  oot, &pRoot, 0))
19540 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
19550 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
19560 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
19570 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19580 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
19590 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
195a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
195b0 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20  e = pRoot;.  }. 
195c0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
195d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
195e0 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52  ze = 0;.  if( pR
195f0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
19600 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
19610 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
19620 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
19630 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b  Root->pgno==1 );
19640 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
19650 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
19660 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
19670 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
19680 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e  assert( subpage>
19690 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 );.    pCur->e
196a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
196b0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
196c0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
196d0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20   subpage);.  }. 
196e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
196f0 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ((pCur->pPage->n
19700 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
19710 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
19720 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  LID);.  return r
19730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
19740 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
19750 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
19760 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
19770 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
19780 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
19790 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
197a0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
197b0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
197c0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
197d0 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
197e0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
197f0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
19800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19810 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
19820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19830 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
19840 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19850 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
19860 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
19870 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
19880 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  xHeld(pCur->pBtr
19890 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ee->pBt->mutex) 
198a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
198b0 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
198c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
198d0 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
198e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
198f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19900 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
19910 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
19920 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
19930 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
19940 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
19950 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
19960 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
19970 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
19980 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
19990 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
199a0 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20  pCur->idx));.   
199b0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
199c0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
199d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
199e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
199f0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19a00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
19a10 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
19a20 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
19a30 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
19a40 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
19a50 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
19a60 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
19a70 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
19a80 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
19a90 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
19aa0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
19ab0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
19ac0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
19ad0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
19ae0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
19af0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
19b00 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
19b10 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
19b20 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
19b30 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
19b40 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
19b50 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
19b60 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
19b70 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
19b80 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
19b90 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19ba0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
19bb0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
19bc0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
19bd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19be0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
19bf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19c00 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
19c10 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
19c20 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
19c40 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 43  treeMutexHeld(pC
19c50 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  ur->pBtree->pSql
19c60 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
19c70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19c80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19c90 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
19ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19cb0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
19cc0 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
19cd0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
19ce0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
19cf0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
19d00 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
19d10 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
19d20 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
19d30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
19d40 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
19d50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19d60 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64   ){.    pCur->id
19d70 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
19d80 20 2d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e   - 1;.    pCur->
19d90 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19da0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19db0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
19dc0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
19dd0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
19de0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
19df0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19e00 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
19e10 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
19e20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
19e30 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
19e40 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
19e50 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
19e60 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
19e70 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
19e80 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
19e90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19ea0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
19eb0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
19ed0 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  exHeld(pCur->pBt
19ee0 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  ree->pBt->mutex)
19ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
19f00 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
19f10 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
19f20 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
19f30 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
19f40 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
19f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19f60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
19f70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19f80 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
19f90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
19fa0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
19fb0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
19fc0 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
19fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
19ff0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1a000 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
1a010 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1a020 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1a030 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1a040 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a050 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1a060 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1a070 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1a080 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1a090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1a0a0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1a0b0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1a0c0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1a0d0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1a0e0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1a0f0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1a100 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1a110 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1a120 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
1a130 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1a140 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1a150 0a 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  . .  assert( sql
1a160 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
1a170 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1a180 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1a190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a1a0 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
1a1b0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53  pCur->pBtree->pS
1a1c0 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b  qlite->mutex) );
1a1d0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1a1e0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1a1f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a200 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
1a210 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1a220 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
1a230 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1a240 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1a250 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1a260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a270 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a280 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a290 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
1a2a0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1a2b0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
1a2c0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
1a2d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a2e0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1a2f0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1a300 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1a310 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f  entry near pKey/
1a320 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  nKey..** Return 
1a330 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
1a340 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
1a350 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68   tables, only th
1a360 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72  e nKey parameter
1a370 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
1a380 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
1a390 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73  For other tables
1a3a0 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75  , nKey is the nu
1a3b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a3c0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79   data.** in pKey
1a3d0 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  .  The compariso
1a3e0 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  n function speci
1a3f0 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  fied when the cu
1a400 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61  rsor was.** crea
1a410 74 65 64 20 69 73 20 75 73 65 64 20 74 6f 20 63  ted is used to c
1a420 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a  ompare keys..**.
1a430 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1a440 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1a450 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1a460 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1a470 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1a480 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1a490 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1a4a0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1a4b0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1a4c0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1a4d0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1a4e0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1a4f0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1a500 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1a510 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  The result of co
1a520 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
1a530 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
1a540 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63  o which the.** c
1a550 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e  ursor is written
1a560 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65   to *pRes if pRe
1a570 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65  s!=NULL.  The me
1a580 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73  aning of.** this
1a590 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c   value is as fol
1a5a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1a5b0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
1a5c0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1a5d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1a5e0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1a600 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b   smaller than pK
1a610 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
1a620 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
1a650 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
1a660 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
1a670 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
1a680 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
1a690 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1a6a0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1a6b0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1a6c0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
1a6d0 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e  ly matches pKey.
1a6e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1a6f0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1a700 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1a710 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1a720 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a730 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1a740 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a  er than pKey..**
1a750 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a760 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
1a770 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1a780 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1a790 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
1a7a0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1a7b0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1a7c0 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f  e key content fo
1a7d0 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20  r indices.  Not 
1a7e0 75 73 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a  used by tables *
1a7f0 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
1a800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1a810 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20  ze of pKey.  Or 
1a820 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  the key for tabl
1a830 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
1a840 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f  Right,         /
1a850 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1a860 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1a870 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1a880 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1a890 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
1a8a0 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a   result flag */.
1a8b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1a8c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1a8d0 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 43  treeMutexHeld(pC
1a8e0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2d  ur->pBtree->pBt-
1a8f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1a900 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1a910 65 4d 75 74 65 78 48 65 6c 64 28 70 43 75 72 2d  eMutexHeld(pCur-
1a920 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65  >pBtree->pSqlite
1a930 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1a940 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1a950 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1a960 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a970 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1a980 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
1a990 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1a9a0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1a9b0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a9c0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1a9d0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1a9e0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1a9f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1aa00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1aa10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1aa20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20   }.  for(;;){.  
1aa30 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1aa40 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1aa50 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1aa60 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1aa70 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d  e;.    int c = -
1aa80 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75  1;  /* pRes retu
1aa90 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65  rn if table is e
1aaa0 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20  mpty must be -1 
1aab0 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  */.    lwr = 0;.
1aac0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
1aad0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
1aae0 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
1aaf0 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   && pKey==0 ){. 
1ab00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ab10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ab20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1ab30 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1ab40 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75 70    pCur->idx = up
1ab50 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1ab60 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1ab70 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20  (upr+lwr)/2;.   
1ab80 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c 3d   }.    if( lwr<=
1ab90 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20  upr ) for(;;){. 
1aba0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
1abb0 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  Key;.      i64 n
1abc0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70  CellKey;.      p
1abd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1abe0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1abf0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1ac00 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c          u8 *pCel
1ac10 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
1ac20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1ac30 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b 20  e, pCur->idx) + 
1ac40 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
1ac50 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
1ac60 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
1ac70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
1ac80 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
1ac90 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
1aca0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26 64  rint32(pCell, &d
1acb0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
1acc0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
1acd0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20 2a  nt(pCell, (u64 *
1ace0 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1acf0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1ad00 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  y<nKey ){.      
1ad10 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
1ad20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
1ad30 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20  ellKey>nKey ){. 
1ad40 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
1ad50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ad60 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1ad70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ad80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ad90 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20  int available;. 
1ada0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1adb0 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50  = (void *)fetchP
1adc0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76  ayload(pCur, &av
1add0 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  ailable, 0);.   
1ade0 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20       nCellKey = 
1adf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1ae00 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61  .        if( ava
1ae10 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79  ilable>=nCellKey
1ae20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1ae30 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65  = pCur->xCompare
1ae40 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65  (pCur->pArg, nCe
1ae50 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1ae60 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
1ae70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ae80 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1ae90 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1aea0 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20  ( nCellKey );.  
1aeb0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
1aec0 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  lKey==0 ) return
1aed0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1aee0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1aef0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
1af00 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
1af10 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65   (void *)pCellKe
1af20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  y);.          c 
1af30 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65  = pCur->xCompare
1af40 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65  (pCur->pArg, nCe
1af50 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1af60 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
1af70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1af80 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
1af90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1afa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1afb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1afc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1afd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1afe0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1aff0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1b000 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1b010 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1b020 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e      lwr = pCur->
1b030 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
1b040 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
1b050 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b060 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b070 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
1b080 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20   ) *pRes = 0;.  
1b090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1b0a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1b0b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b0c0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1b0d0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1b0e0 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65  >idx+1;.      }e
1b0f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1b100 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a   = pCur->idx-1;.
1b110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b120 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1b130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b140 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
1b150 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
1b160 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  2;.    }.    ass
1b170 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1b180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b190 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1b1a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1b1b0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1b1c0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1b1d0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1b1e0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1b1f0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1b200 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1b210 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b220 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1b230 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1b240 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1b250 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1b260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b270 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1b280 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b290 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1b2a0 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
1b2b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
1b2c0 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1b2d0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65 74  s = c;.      ret
1b2e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b2f0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1b300 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43  dx = lwr;.    pC
1b310 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1b320 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
1b330 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
1b340 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
1b350 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1b360 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1b370 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45  .  /* NOT REACHE
1b380 44 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  D */.}.../*.** R
1b390 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1b3a0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1b3b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1b3c0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
1b3d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
1b3e0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
1b3f0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
1b400 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1b410 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
1b420 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1b430 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
1b440 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
1b450 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
1b460 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
1b470 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
1b480 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
1b490 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1b4a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b4b0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
1b4c0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
1b4d0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
1b4e0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
1b4f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
1b500 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
1b510 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
1b520 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
1b530 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
1b540 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
1b550 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
1b560 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
1b570 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
1b580 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
1b590 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
1b5a0 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
1b5b0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
1b5c0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
1b5d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
1b5e0 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73  andle for a curs
1b5f0 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  or..*/.sqlite3 *
1b600 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1b610 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72  orDb(const BtCur
1b620 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1b630 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65  turn pCur->pBtre
1b640 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 7d 0a 0a 2f  e->pSqlite;.}../
1b650 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1b660 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1b670 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1b680 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1b690 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1b6a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1b6b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1b6c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1b6d0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1b6e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1b6f0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1b700 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1b710 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1b720 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1b730 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1b740 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1b750 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1b760 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1b770 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1b780 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
1b790 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
1b7a0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1b7b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b7c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b7d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
1b7e0 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  s!=0 );.  pPage 
1b7f0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1b800 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1b810 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1b820 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1b830 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1b840 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1b850 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
1b860 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1b870 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1b880 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1b890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b8a0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1b8b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
1b8c0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b8d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1b8e0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
1b8f0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b  );..  pCur->idx+
1b900 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  +;.  pCur->info.
1b910 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
1b920 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67   pCur->idx>=pPag
1b930 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1b940 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1b950 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
1b960 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1b970 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1b980 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1b990 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
1b9a0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1b9b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
1b9c0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1b9d0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1b9e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1b9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ba00 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
1ba10 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
1ba20 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  IsRootPage(pPage
1ba30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  ) ){.        *pR
1ba40 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1ba50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1ba60 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1ba70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1ba80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1ba90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1baa0 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1bab0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
1bac0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1bad0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
1bae0 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e  ur->idx>=pPage->
1baf0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
1bb00 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
1bb10 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
1bb20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1bb30 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
1bb40 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1bb50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1bb60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1bb70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
1bb80 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
1bb90 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
1bba0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
1bbb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bbc0 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
1bbd0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1bbe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
1bbf0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1bc00 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1bc10 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1bc20 20 69 6e 74 20 72 63 3b 0a 20 20 63 75 72 73 6f   int rc;.  curso
1bc30 72 45 6e 74 65 72 28 70 43 75 72 29 3b 0a 20 20  rEnter(pCur);.  
1bc40 72 63 20 3d 20 62 74 72 65 65 4e 65 78 74 28 70  rc = btreeNext(p
1bc50 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 63 75  Cur, pRes);.  cu
1bc60 72 73 6f 72 4c 65 61 76 65 28 70 43 75 72 29 3b  rsorLeave(pCur);
1bc70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bc80 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
1bc90 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
1bca0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
1bcb0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
1bcc0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1bcd0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1bce0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1bcf0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1bd00 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1bd10 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
1bd20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1bd30 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
1bd40 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1bd50 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
1bd60 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
1bd70 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1bd80 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
1bd90 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1bda0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1bdb0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d    Pgno pgno;.  M
1bdc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1bdd0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
1bde0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
1bdf0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1be00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1be10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1be20 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53 4f  .  }.  if( CURSO
1be30 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1be40 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1be50 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1be60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1be70 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1be80 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
1be90 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1bea0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1beb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bec0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1bed0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
1bee0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1bef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bf00 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1bf10 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
1bf20 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  =0 );.  if( !pPa
1bf30 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1bf40 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1bf50 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1bf60 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20   pCur->idx) );. 
1bf70 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1bf80 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1bf90 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1bfa0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1bfb0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1bfc0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1bfd0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
1bfe0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
1bff0 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
1c000 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
1c010 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  IsRootPage(pPage
1c020 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  ) ){.        pCu
1c030 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1c040 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1c050 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1c070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1c080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1c090 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1c0a0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
1c0b0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1c0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1c0d0 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75  ->idx--;.    pCu
1c0e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1c0f0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1c100 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1c110 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c130 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1c140 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1c150 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c170 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1c180 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1c190 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1c1a0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1c1b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1c1c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1c1d0 0a 20 20 63 75 72 73 6f 72 45 6e 74 65 72 28 70  .  cursorEnter(p
1c1e0 43 75 72 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  Cur);.  rc = btr
1c1f0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
1c200 20 70 52 65 73 29 3b 0a 20 20 63 75 72 73 6f 72   pRes);.  cursor
1c210 4c 65 61 76 65 28 70 43 75 72 29 3b 0a 20 20 72  Leave(pCur);.  r
1c220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c230 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1c240 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1c250 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1c260 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1c270 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1c280 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1c290 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
1c2a0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
1c2b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c2c0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1c2d0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1c2e0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1c2f0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1c300 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1c310 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1c320 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1c330 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1c340 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1c350 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1c360 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1c370 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1c380 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1c390 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1c3a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1c3b0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1c3c0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1c3d0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1c3e0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1c3f0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1c400 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1c410 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
1c420 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
1c430 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1c440 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1c450 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
1c460 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1c470 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
1c480 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
1c490 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
1c4a0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
1c4b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1c4c0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
1c4d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
1c4e0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
1c4f0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
1c500 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
1c510 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
1c520 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
1c530 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
1c540 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
1c550 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
1c560 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
1c570 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
1c580 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
1c590 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
1c5a0 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
1c5b0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
1c5c0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
1c5d0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
1c5e0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
1c5f0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
1c600 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1c610 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
1c620 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
1c630 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
1c640 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1c650 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
1c660 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1c670 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1c680 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1c690 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
1c6a0 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
1c6b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c6c0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
1c6d0 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
1c6e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1c6f0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1c700 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
1c710 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1c720 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
1c730 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1c740 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
1c750 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
1c760 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
1c770 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
1c780 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
1c790 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c7a0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
1c7b0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d  t->pPage1;.  n =
1c7c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1c7d0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1c7e0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1c7f0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
1c800 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1c810 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
1c820 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
1c830 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
1c840 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
1c850 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
1c860 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
1c870 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
1c880 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
1c890 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
1c8a0 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
1c8b0 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
1c8c0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
1c8d0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
1c8e0 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
1c8f0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1c900 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
1c910 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
1c920 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
1c930 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
1c940 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
1c950 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
1c960 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1c970 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1c980 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26  .    if( exact &
1c990 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c 69 74 65  & nearby<=sqlite
1c9a0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1c9b0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1c9c0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
1c9d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
1c9e0 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
1c9f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1ca00 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
1ca10 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1ca20 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
1ca30 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      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 20 20 69 66 28 20 65 54 79  c;.      if( eTy
1ca60 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1ca70 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
1ca80 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
1ca90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
1caa0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
1cab0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1cac0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1cad0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
1cae0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
1caf0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
1cb00 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
1cb10 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
1cb20 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
1cb30 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
1cb40 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
1cb50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cb60 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1cb70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1cb80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1cb90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1cba0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1cbb0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
1cbc0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
1cbd0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
1cbe0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
1cbf0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
1cc00 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
1cc10 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
1cc20 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
1cc30 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
1cc40 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
1cc50 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
1cc60 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
1cc70 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
1cc80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
1cc90 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
1cca0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
1ccb0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
1ccc0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
1ccd0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1cce0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1ccf0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
1cd00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
1cd10 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1cd20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1cd30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1cd40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1cd50 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1cd60 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
1cd70 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1cd80 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
1cd90 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1cda0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1cdb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
1cdc0 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
1cdd0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1cde0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
1cdf0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
1ce00 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
1ce10 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
1ce20 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
1ce30 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
1ce40 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
1ce50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
1ce60 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
1ce70 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
1ce80 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
1ce90 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
1cea0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
1ceb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1cec0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
1ced0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1cee0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1cef0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1cf00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1cf10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1cf20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1cf30 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1cf40 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
1cf50 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
1cf60 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1cf70 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1cf80 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1cf90 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
1cfa0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1cfb0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1cfc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1cfd0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1cfe0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1cff0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1d000 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1d010 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d020 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  k>pBt->usableSiz
1d030 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1d040 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
1d050 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1d060 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
1d070 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1d080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1d090 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1d0a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d0b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
1d0c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d0d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1d0e0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
1d0f0 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
1d100 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
1d110 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
1d120 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
1d130 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
1d140 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
1d150 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
1d160 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
1d170 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
1d180 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
1d190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d1a0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
1d1b0 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
1d1c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1d1d0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
1d1e0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
1d1f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d200 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1d210 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1d220 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d230 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1d240 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1d250 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d260 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
1d270 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1d280 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1d290 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1d2a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d2b0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1d2c0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1d2d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d2e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1d2f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1d300 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1d310 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1d320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d340 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
1d350 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
1d360 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
1d370 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
1d380 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
1d390 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
1d3a0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
1d3b0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
1d3c0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
1d3d0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
1d3e0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
1d3f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1d400 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
1d410 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
1d420 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
1d430 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1d440 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
1d450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d460 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1d470 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
1d480 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
1d490 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1d4c0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1d4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d4e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d4f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1d500 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
1d510 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1d520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1d540 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1d550 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1d560 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1d570 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1d580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d590 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1d5a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1d5b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1d5c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
1d5d0 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
1d5e0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
1d5f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
1d600 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1d610 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
1d620 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
1d630 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
1d640 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d650 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1d660 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1d670 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1d680 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d690 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1d6a0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1d6b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d6c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d6d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d6e0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
1d6f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d700 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d710 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1d720 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1d730 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1d740 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1d750 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1d760 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
1d770 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1d780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d790 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1d7a0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1d7b0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1d7c0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1d7d0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1d7e0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
1d7f0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1d800 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
1d810 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
1d820 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
1d830 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73        int closes
1d840 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
1d850 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
1d860 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
1d870 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
1d880 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ata;.        rc 
1d890 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d8a0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1d8b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1d8c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d8d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1d8e0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1d8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d900 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
1d910 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73        int i, dis
1d920 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  t;.          clo
1d930 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1d940 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62      dist = get4b
1d950 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
1d960 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1d970 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20     if( dist<0 ) 
1d980 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20  dist = -dist;.  
1d990 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
1d9a0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
1d9b0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
1d9c0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1d9d0 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
1d9e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
1d9f0 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d  f( d2<0 ) d2 = -
1da00 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1da10 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
1da30 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
1da40 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
1da50 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
1da60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1da70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1da80 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1da90 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1daa0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
1dab0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1dac0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
1dad0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
1dae0 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
1daf0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
1db00 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
1db10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
1db20 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50   *pPgno>sqlite3P
1db30 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1db40 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1db50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
1db60 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65  e page off the e
1db70 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
1db80 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  /.            re
1db90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1dba0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1dbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dbc0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1dbd0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
1dbe0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
1dbf0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
1dc00 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
1dc10 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
1dc40 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
1dc50 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
1dc60 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
1dc70 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
1dc80 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
1dc90 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
1dca0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
1dcb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1dcc0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1dcd0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
1dce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1dcf0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1dd00 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
1dd10 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  o, ppPage, 1);. 
1dd20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1dd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dd50 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1dd60 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  ck((*ppPage)->pD
1dd70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1dd80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dd90 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1dda0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ddc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ddd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1dde0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1ddf0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1de00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1de10 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
1de20 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
1de30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1de40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1de50 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
1de60 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1de70 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
1de80 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
1de90 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1dea0 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
1deb0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
1dec0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
1ded0 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
1dee0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1def0 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d   */.    *pPgno =
1df00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1df10 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1df20 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65  er) + 1;..#ifnde
1df30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1df40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1df50 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a   pBt->nTrunc ){.
1df60 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72        /* An incr
1df70 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65  -vacuum has alre
1df80 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74  ady run within t
1df90 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
1dfa0 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   So the.      **
1dfb0 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74   page to allocat
1dfc0 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68  e is not from th
1dfd0 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f  e physical end o
1dfe0 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a  f the file, but.
1dff0 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d        ** at pBt-
1e000 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20  >nTrunc. .      
1e010 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  */.      *pPgno 
1e020 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b  = pBt->nTrunc+1;
1e030 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
1e040 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
1e050 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1e060 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
1e070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e080 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1e090 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
1e0a0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50  _ISPAGE(pBt, *pP
1e0b0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  gno) ){.      /*
1e0c0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
1e0d0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
1e0e0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
1e0f0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
1e100 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
1e110 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1e120 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
1e130 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
1e140 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
1e150 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
1e160 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e170 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
1e180 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
1e190 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
1e1a0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e1b0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1e1c0 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
1e1d0 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
1e1e0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  *pPgno));.      
1e1f0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1e200 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e210 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
1e220 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
1e230 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  }.    if( pBt->n
1e240 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  Trunc ){.      p
1e250 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50  Bt->nTrunc = *pP
1e260 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  gno;.    }.#endi
1e270 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1e280 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1e290 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1e2a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e2b0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1e2c0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1e2d0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1e2e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e2f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e300 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1e310 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1e320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1e340 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1e350 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
1e360 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1e370 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1e380 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
1e390 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1e3a0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1e3b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e3c0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
1e3d0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
1e3e0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1e3f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1e400 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
1e410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1e420 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
1e430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1e440 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1e450 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
1e460 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
1e470 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1e480 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e490 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1e4a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1e4b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1e4c0 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1e4d0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1e4e0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1e4f0 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1e500 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1e510 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1e520 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e530 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28  3BtreeMutexHeld(
1e540 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1e550 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1e560 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
1e570 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1e580 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1e590 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65  age(pPage->pPare
1e5a0 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50  nt);.  pPage->pP
1e5b0 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  arent = 0;..  /*
1e5c0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
1e5d0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
1e5e0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
1e5f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e600 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1e610 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1e620 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1e630 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1e640 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1e650 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
1e660 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1e670 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  n+1);..#ifdef SQ
1e680 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1e690 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
1e6a0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1e6b0 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
1e6c0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
1e6d0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
1e6e0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
1e6f0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
1e700 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
1e710 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ros..  */.  rc =
1e720 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e730 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1e740 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1e750 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73  eturn rc;.  mems
1e760 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1e770 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
1e780 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
1e790 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1e7a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e7b0 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1e7c0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1e7d0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1e7e0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1e7f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1e800 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1e810 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1e820 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1e830 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1e840 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1e850 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1e860 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1e870 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1e880 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e890 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1e8a0 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1e8b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1e8c0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1e8d0 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1e8e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e8f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1e900 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d  return rc;.    m
1e920 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1e930 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70  ta, 0, 8);.    p
1e940 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e950 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1e960 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52  e->pgno);.    TR
1e970 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1e980 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50   %d first\n", pP
1e990 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
1e9a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
1e9b0 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c  er free pages al
1e9c0 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65  ready exist.  Re
1e9d0 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20  trive the first 
1e9e0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a  trunk page.    *
1e9f0 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  * of the freelis
1ea00 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68  t and find out h
1ea10 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69  ow many leaves i
1ea20 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  t has. */.    Me
1ea30 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20  mPage *pTrunk;. 
1ea40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1ea50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ea60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1ea70 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26  1->aData[32]), &
1ea80 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1ea90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1eaa0 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1eab0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1eac0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1ead0 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1eae0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1eaf0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1eb00 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1eb10 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1eb20 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1eb30 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1eb40 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1eb50 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1eb60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1eb70 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1eb80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1eb90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1eba0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1ebb0 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1ebc0 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1ebd0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1ebe0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
1ebf0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ec00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1ec10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1ec20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
1ec30 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
1ec40 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
1ec50 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cing %d\n",.    
1ec60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
1ec70 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70  >pgno, pTrunk->p
1ec80 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1ec90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1eca0 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1ecb0 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1ecc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1ecd0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1ece0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ecf0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1ed00 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1ed10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ed20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1ed30 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1ed40 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1ed50 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
1ed60 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d  nk->aData[8+k*4]
1ed70 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1ed80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
1ed90 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
1eda0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1edb0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
1edc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
1edd0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
1ede0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1edf0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1ee00 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1ee10 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1ee20 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1ee30 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1ee40 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1ee50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ee60 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1ee70 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1ee80 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1ee90 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1eea0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1eeb0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1eec0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1eed0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
1eee0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1eef0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
1ef00 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
1ef10 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
1ef20 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
1ef30 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
1ef40 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
1ef50 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
1ef60 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70  texHeld(pPage->p
1ef70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1ef80 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1ef90 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
1efa0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1efb0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1efc0 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
1efd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
1efe0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
1eff0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
1f000 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1f010 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
1f020 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
1f030 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
1f040 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66  verflow]);.  ovf
1f050 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
1f060 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
1f070 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
1f080 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
1f090 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
1f0a0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
1f0b0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
1f0c0 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
1f0d0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
1f0e0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
1f0f0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
1f100 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76  Ovfl;.    if( ov
1f110 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66  flPgno==0 || ovf
1f120 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67  lPgno>sqlite3Pag
1f130 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1f140 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1f150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f160 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f170 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65    }..    rc = ge
1f180 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
1f190 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
1f1a0 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f  vfl, (nOvfl==0)?
1f1b0 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  0:&ovflPgno);.  
1f1c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f1d0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66  n rc;.    rc = f
1f1e0 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  reePage(pOvfl);.
1f1f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f200 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
1f210 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1f220 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f230 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f240 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f250 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
1f260 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
1f270 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
1f280 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
1f290 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
1f2a0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
1f2b0 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
1f2c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1f2d0 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
1f2e0 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
1f2f0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
1f300 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1f310 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
1f320 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
1f330 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
1f340 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
1f350 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
1f360 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
1f370 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
1f380 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
1f390 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
1f3a0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
1f3b0 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
1f3c0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
1f3d0 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
1f3e0 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
1f3f0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
1f400 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
1f410 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
1f420 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
1f430 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
1f440 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
1f450 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
1f460 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
1f470 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1f480 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1f490 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1f4a0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
1f4b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
1f4c0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
1f4d0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1f4e0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
1f4f0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1f500 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
1f510 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
1f520 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
1f530 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
1f540 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
1f550 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
1f560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1f570 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
1f580 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
1f590 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
1f5a0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
1f5b0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1f5c0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
1f5d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
1f5e0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
1f5f0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
1f600 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
1f610 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
1f620 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
1f630 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
1f640 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
1f650 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
1f660 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
1f670 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
1f680 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f690 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1f6a0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
1f6b0 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
1f6c0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
1f6d0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1f6e0 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
1f6f0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1f700 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1f710 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
1f720 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
1f730 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
1f740 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1f750 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
1f760 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
1f770 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
1f780 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
1f790 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
1f7a0 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
1f7b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1f7c0 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
1f7d0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
1f7e0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1f7f0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
1f800 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73  u64*)&nKey);.  s
1f810 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
1f820 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
1f830 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1f840 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
1f850 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
1f860 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1f870 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
1f880 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
1f890 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20  ta==nData+nZero 
1f8a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
1f8b0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
1f8c0 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
1f8d0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
1f8e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1f8f0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
1f900 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
1f910 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
1f920 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
1f930 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
1f940 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20   nKey;.    pSrc 
1f950 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
1f960 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a   = nKey;.  }.  *
1f970 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
1f980 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
1f990 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
1f9a0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
1f9b0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
1f9c0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
1f9d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
1f9e0 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
1f9f0 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
1fa00 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
1fa10 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61  .      int isExa
1fa20 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ct = 0;.#ifndef 
1fa30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fa40 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
1fa50 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
1fa60 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
1fa70 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1fa80 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
1fa90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1faa0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1fab0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
1fac0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
1fad0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
1fae0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
1faf0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1fb00 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
1fb10 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
1fb20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fb30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1fb40 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c      if( pgnoOvfl
1fb50 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1fb60 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20  /* isExact = 1; 
1fb70 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
1fb80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fb90 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1fba0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1fbb0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
1fbc0 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61   pgnoOvfl, isExa
1fbd0 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
1fbe0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fbf0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
1fc00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
1fc10 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
1fc20 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
1fc30 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
1fc40 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
1fc50 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
1fc60 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
1fc70 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
1fc80 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
1fc90 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
1fca0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
1fcb0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
1fcc0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
1fcd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1fce0 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
1fcf0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
1fd00 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
1fd10 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
1fd20 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
1fd30 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
1fd40 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
1fd50 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
1fd60 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
1fd70 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
1fd80 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
1fd90 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
1fda0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
1fdb0 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e  alised values an
1fdc0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
1fdd0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
1fde0 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
1fdf0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
1fe00 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1fe10 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
1fe20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fe30 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
1fe40 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
1fe50 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
1fe60 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
1fe70 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
1fe80 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
1fe90 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
1fea0 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20  Ptrmap);.       
1feb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1fec0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1fed0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
1fee0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1fef0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
1ff00 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
1ff10 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
1ff20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ff30 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ff40 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
1ff50 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
1ff60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ff70 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
1ff80 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
1ff90 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
1ffa0 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
1ffb0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
1ffc0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
1ffd0 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
1ffe0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
1fff0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
20000 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
20010 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
20020 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
20030 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
20040 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
20050 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20  ceLeft;.    if( 
20060 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
20070 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
20080 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
20090 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
200a0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
200b0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
200c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
200d0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
200e0 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
200f0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
20100 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
20110 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
20120 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
20130 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
20140 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
20150 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
20160 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
20170 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
20180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
20190 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
201a0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
201b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
201c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d  * Change the Mem
201d0 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69  Page.pParent poi
201e0 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65  nter on the page
201f0 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73   whose number is
20200 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  .** given in the
20210 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20220 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65   so that MemPage
20230 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74  .pParent holds t
20240 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e  he.** pointer in
20250 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
20260 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
20270 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  nt reparentPage(
20280 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
20290 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67  gno pgno, MemPag
202a0 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69  e *pNewParent, i
202b0 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61  nt idx){.  MemPa
202c0 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50  ge *pThis;.  DbP
202d0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
202e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
202f0 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
20300 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20310 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72 65  assert( pNewPare
20320 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  nt!=0 );.  if( p
20330 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  gno==0 ) return 
20340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
20350 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72  ert( pBt->pPager
20360 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65  !=0 );.  pDbPage
20370 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
20380 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
20390 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
203a0 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70  pDbPage ){.    p
203b0 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20  This = (MemPage 
203c0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
203d0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
203e0 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e  .    if( pThis->
203f0 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  isInit ){.      
20400 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61  assert( pThis->a
20410 44 61 74 61 3d 3d 28 73 71 6c 69 74 65 33 50 61  Data==(sqlite3Pa
20420 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
20430 67 65 29 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ge)) );.      if
20440 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  ( pThis->pParent
20450 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a  !=pNewParent ){.
20460 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68 69          if( pThi
20470 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c  s->pParent ) sql
20480 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
20490 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  This->pParent->p
204a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
204b0 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
204c0 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = pNewParent;.  
204d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
204e0 65 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74  erRef(pNewParent
204f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20500 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d    }.      pThis-
20510 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78  >idxParent = idx
20520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20530 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
20540 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66  bPage);.  }..#if
20550 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20560 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
20570 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20580 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  m ){.    return 
20590 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
205a0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
205b0 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  E, pNewParent->p
205c0 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gno);.  }.#endif
205d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
205e0 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK;.}..../*.** 
205f0 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65  Change the pPare
20600 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c  nt pointer of al
20610 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
20620 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63  age to point bac
20630 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a  k.** to pPage..*
20640 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
20650 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63  rds, for every c
20660 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69  hild of pPage, i
20670 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61  nvoke reparentPa
20680 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ge().** to make 
20690 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63  sure that each c
206a0 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20  hild knows that 
206b0 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72  pPage is its par
206c0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
206d0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
206e0 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65  led after you me
206f0 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20  mcpy() one page 
20700 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e  into.** another.
20710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
20720 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
20730 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
20740 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74  ){.  int i;.  Bt
20750 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
20760 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
20770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20780 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20790 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64  e3BtreeMutexHeld
207a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
207b0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ex) );.  if( pPa
207c0 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72  ge->leaf ) retur
207d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
207e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
207f0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
20800 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
20810 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
20820 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
20830 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
20840 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61   rc = reparentPa
20850 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
20860 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20  (pCell), pPage, 
20870 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
20880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
20890 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
208a0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
208b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
208c0 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
208d0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
208e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
208f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c  ->hdrOffset+8]),
20900 20 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c 20   .       pPage, 
20910 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  i);.    pPage->i
20920 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d  dxShift = 0;.  }
20930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20940 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
20950 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
20960 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
20970 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
20980 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
20990 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
209a0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
209b0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
209c0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
209d0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
209e0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
209f0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
20a00 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
20a10 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
20a20 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
20a30 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
20a40 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
20a50 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
20a60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
20a70 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
20a80 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
20a90 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
20aa0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
20ab0 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
20ac0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20ad0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
20ae0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
20af0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
20b00 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
20b10 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
20b20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
20b30 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
20b40 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
20b50 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
20b60 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
20b70 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
20b80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
20b90 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
20ba0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
20bb0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
20bc0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
20bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
20be0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
20bf0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
20c00 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
20c10 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75  ( sqlite3BtreeMu
20c20 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70  texHeld(pPage->p
20c30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20c40 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
20c50 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
20c60 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
20c70 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
20c80 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
20c90 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tr);.  assert( p
20ca0 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70  c>10 && pc+sz<=p
20cb0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
20cc0 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53  eSize );.  freeS
20cd0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
20ce0 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78  sz);.  for(i=idx
20cf0 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  +1; i<pPage->nCe
20d00 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29  ll; i++, ptr+=2)
20d10 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70  {.    ptr[0] = p
20d20 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31  tr[2];.    ptr[1
20d30 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a  ] = ptr[3];.  }.
20d40 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
20d50 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
20d60 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
20d70 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
20d80 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
20d90 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50  nFree += 2;.  pP
20da0 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
20db0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  1;.}../*.** Inse
20dc0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
20dd0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
20de0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
20df0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
20e00 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
20e10 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
20e20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
20e30 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
20e40 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
20e50 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
20e60 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
20e70 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
20e80 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
20e90 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
20ea0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
20eb0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
20ec0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
20ed0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
20ee0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
20ef0 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
20f00 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
20f10 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
20f20 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
20f30 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
20f40 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
20f50 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
20f60 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
20f70 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
20f80 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
20f90 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
20fa0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
20fb0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
20fc0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
20fd0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
20fe0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
20ff0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
21000 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
21010 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
21020 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
21030 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
21040 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21050 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
21060 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
21070 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
21080 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
21090 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
210a0 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
210b0 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
210c0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
210d0 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
210e0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
210f0 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
21100 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
21110 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
21120 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
21130 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
21140 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
21150 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
21160 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
21170 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
21180 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
21190 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
211a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
211b0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
211c0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
211d0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
211e0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
211f0 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
21200 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38  f needed */.  u8
21210 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   nSkip          
21220 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  /* Do not write 
21230 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
21240 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
21250 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  l */.){.  int id
21260 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
21270 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
21280 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
21290 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
212a0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
212b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
212c0 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
212d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
212e0 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
212f0 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
21300 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
21310 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
21320 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
21330 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
21340 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
21350 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
21360 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21370 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
21380 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
21390 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
213a0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
213b0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
213c0 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
213d0 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
213e0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
213f0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
21400 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
21410 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
21420 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
21430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
21440 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
21450 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
21460 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
21470 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
21480 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
21490 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
214a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  /..  assert( i>=
214b0 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
214c0 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
214d0 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
214e0 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50  t( sz==cellSizeP
214f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
21500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21510 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
21520 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
21530 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
21540 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
21550 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
21560 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
21570 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
21580 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
21590 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
215a0 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
215b0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
215c0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
215d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
215e0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
215f0 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
21600 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
21610 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
21620 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
21630 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
21640 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
21650 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
21660 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
21670 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
21680 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
21690 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
216a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
216b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
216c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
216d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
216e0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
216f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
21700 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
21710 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
21720 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
21730 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
21740 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
21750 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
21760 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
21770 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
21780 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
21790 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
217a0 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
217b0 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
217c0 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
217d0 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
217e0 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
217f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
21800 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
21810 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
21820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
21830 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21840 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
21850 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
21860 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
21870 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
21880 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
21890 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
218a0 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
218b0 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
218c0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
218d0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
218e0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70  hdr+5]) );.    p
218f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
21900 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
21910 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
21920 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
21930 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
21940 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
21950 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
21960 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
21970 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
21980 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
21990 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
219a0 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
219b0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
219c0 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
219d0 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
219e0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
219f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
21a00 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
21a10 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ft = 1;.#ifndef 
21a20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
21a30 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
21a40 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
21a50 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
21a60 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
21a70 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
21a80 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
21a90 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
21aa0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
21ab0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
21ac0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
21ad0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
21ae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21af0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
21b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21b10 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
21b20 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
21b30 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fo);.      asser
21b40 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
21b50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
21b60 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
21b70 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
21b80 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
21b90 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
21ba0 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
21bb0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
21bc0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e          Pgno pgn
21bd0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
21be0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
21bf0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
21c00 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
21c10 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
21c20 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
21c30 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
21c40 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
21c50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21c60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
21c80 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  if.  }..  return
21c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21ca0 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
21cb0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
21cc0 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
21cd0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
21ce0 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
21cf0 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
21d00 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
21d10 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
21d20 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
21d30 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
21d40 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
21d50 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
21d60 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
21d70 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
21d80 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
21d90 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
21da0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
21db0 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
21dc0 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
21dd0 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
21de0 69 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20 20  int *aSize      
21df0 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
21e00 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
21e10 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21e20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21e30 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c  r */.  int total
21e40 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61  Size;    /* Tota
21e50 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
21e60 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  lls */.  int hdr
21e70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
21e80 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61 64  dex of page head
21e90 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
21ea0 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ptr;      /* Add
21eb0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
21ec0 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
21ed0 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
21ee0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
21ef0 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
21f00 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
21f10 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
21f20 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20   the page */..  
21f30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
21f40 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
21f50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21f60 42 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70  BtreeMutexHeld(p
21f70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
21f80 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  ) );.  totalSize
21f90 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
21fa0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
21fb0 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
21fc0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
21fd0 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
21fe0 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
21ff0 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
22000 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
22010 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
22020 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
22030 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
22040 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
22050 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
22060 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
22070 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
22080 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
22090 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
220a0 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
220b0 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
220c0 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
220d0 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
220e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
220f0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
22100 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
22110 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
22120 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
22130 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
22140 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
22150 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
22160 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
22170 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
22180 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
22190 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
221a0 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
221b0 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
221c0 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
221d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
221e0 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
221f0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
22200 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
22210 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
22220 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
22230 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
22240 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
22250 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
22260 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
22270 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
22280 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
22290 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
222a0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
222b0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
222c0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
222d0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
222e0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
222f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
22300 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
22310 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
22320 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
22330 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
22340 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
22350 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
22360 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
22370 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
22380 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
22390 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
223a0 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
223b0 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
223c0 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
223d0 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
223e0 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
223f0 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
22400 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
22410 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
22420 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
22430 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
22440 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
22450 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
22460 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
22470 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
22480 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
22490 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
224a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
224b0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
224c0 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
224d0 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
224e0 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
224f0 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
22500 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
22510 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
22520 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
22530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
22540 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
22550 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
22560 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
22570 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
22580 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
22590 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
225a0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
225b0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
225c0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
225d0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
225e0 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
225f0 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
22600 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
22610 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
22620 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
22630 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
22640 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
22650 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
22660 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
22670 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
22680 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
22690 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
226a0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
226b0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
226c0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
226d0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
226e0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
226f0 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
22700 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
22710 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
22720 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
22730 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
22740 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
22750 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
22760 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
22770 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
22780 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
22790 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
227a0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
227b0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
227c0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
227d0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
227e0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
227f0 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
22800 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
22810 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
22820 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
22830 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
22840 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
22850 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
22860 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
22870 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
22880 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
22890 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
228a0 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
228b0 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
228c0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
228d0 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
228e0 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
228f0 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b  l;.  int szCell;
22900 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
22910 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
22920 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
22930 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
22940 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
22950 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
22960 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
22970 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
22980 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
229a0 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
229b0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
229c0 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
229f0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
22a00 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
22a10 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
22a20 78 48 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  xHeld(pPage->pBt
22a30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
22a40 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
22a50 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68   page. Insert th
22a60 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
22a70 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20  from pPage.  ** 
22a80 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  into it. Then re
22a90 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  move the overflo
22aa0 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
22ab0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  e..  */.  rc = a
22ac0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
22ad0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
22ae0 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  noNew, 0, 0);.  
22af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22b00 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
22b10 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20  rc;.  }.  pCell 
22b20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
22b30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c  ].pCell;.  szCel
22b40 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
22b50 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
22b60 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
22b70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29  pPage->aData[0])
22b80 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ;.  assemblePage
22b90 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
22ba0 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50  , &szCell);.  pP
22bb0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
22bc0 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   0;..  /* Set th
22bd0 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
22be0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
22bf0 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e  page to pParent.
22c00 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72   */.  pNew->pPar
22c10 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
22c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
22c30 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
22c40 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20  e);..  /* pPage 
22c50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
22c60 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
22c70 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
22c80 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61  this.  ** so tha
22c90 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
22ca0 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67  d is the new pag
22cb0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  e allocated abov
22cc0 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65  e and.  ** pPage
22cd0 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
22ce0 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
22cf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
22d00 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
22d10 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
22d20 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
22d30 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69  nCell-1);.  sqli
22d40 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
22d50 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
22d60 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20  l, &info);.  rc 
22d70 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
22d80 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
22d90 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
22da0 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  0, 0, 0, &parent
22db0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
22dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22de0 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e  .  assert( paren
22df0 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63  tSize<64 );.  rc
22e00 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
22e10 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
22e20 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
22e30 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
22e40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
22e60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74  rn rc;.  }.  put
22e70 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
22e80 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
22e90 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
22ea0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62  ->pgno);.  put4b
22eb0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
22ec0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
22ed0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
22ee0 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ew);..#ifndef SQ
22ef0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22f00 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69  CUUM.  /* If thi
22f10 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
22f20 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
22f30 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
22f40 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65   map.  ** with e
22f50 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
22f60 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
22f70 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
22f80 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  e .  ** cell on 
22f90 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
22fa0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
22fb0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
22fc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
22fd0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
22fe0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
22ff0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
23000 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  nt->pgno);.    i
23010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
23030 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
23040 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w, 0);.    }.   
23050 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
23070 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
23080 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23090 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
230a0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
230b0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
230c0 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64  the new page and
230d0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
230e0 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69  ent page,.  ** i
230f0 6e 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  n case the divid
23100 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
23110 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
23120 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
23130 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67   */.  releasePag
23140 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  e(pNew);.  retur
23150 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e  n balance(pParen
23160 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  t, 0);.}.#endif 
23170 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
23180 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
23190 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
231a0 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
231b0 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20   Cells on pPage 
231c0 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73  and up to NN*2 s
231d0 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50  iblings.** of pP
231e0 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  age so that all 
231f0 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
23200 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74   the same amount
23210 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a   of free space..
23220 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69  ** Usually NN si
23230 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
23240 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69   side of pPage i
23250 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  s used in the ba
23260 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75  lancing,.** thou
23270 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73  gh more siblings
23280 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
23290 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61   one side if pPa
232a0 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  ge is the first.
232b0 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  ** or last child
232c0 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
232d0 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65   If pPage has fe
232e0 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69  wer than 2*NN si
232f0 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74  blings.** (somet
23300 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
23310 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50  nly happen if pP
23320 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
23330 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68  page or a .** ch
23340 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65  ild of root) the
23350 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
23360 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69  siblings partici
23370 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
23380 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
23390 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
233a0 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67  ngs of pPage mig
233b0 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
233c0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
233d0 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e  one or.** two in
233e0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
233f0 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
23400 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
23410 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74  r full. The root
23420 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63   page.** is spec
23430 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77  ial and is allow
23440 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20  ed to be nearly 
23450 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20  empty. If pPage 
23460 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  is .** the root 
23470 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64  page, then the d
23480 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
23490 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
234a0 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61  sed.** or decrea
234b0 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e  sed by one, as n
234c0 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65  ecessary, to kee
234d0 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  p the root page 
234e0 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76  from being.** ov
234f0 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65  erfull or comple
23500 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  tely empty..**.*
23510 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
23520 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23530 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
23540 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50   the Cells on pP
23550 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
23560 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
23570 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  red in pPage->aD
23580 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e  ata[].  This can
23590 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
235a0 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
235b0 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65  ll.  Part of the
235c0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
235d0 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61  tine is to.** ma
235e0 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c  ke sure all Cell
235f0 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65  s for pPage once
23600 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50   again fit in pP
23610 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a  age->aData[]..**
23620 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
23630 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
23640 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  he siblings of p
23650 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74  Page, the parent
23660 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   of pPage.** mig
23670 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ht become overfu
23680 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
23690 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e    If that happen
236a0 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
236b0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
236c0 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
236d0 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   the parent..**.
236e0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
236f0 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
23700 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
23710 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
23720 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
23730 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53  rupted state.  S
23740 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
23750 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
23760 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
23770 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
23780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
23790 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65  lance_nonroot(Me
237a0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
237b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
237c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
237d0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
237e0 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
237f0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
23800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
23810 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
23820 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23840 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
23850 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
23860 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
23870 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23880 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
23890 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
238a0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
238b0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
238d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
238e0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
238f0 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23910 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
23920 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
23930 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23950 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
23960 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
23970 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23990 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
239a0 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
239d0 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
239e0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
239f0 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
23a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
23a10 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
23a20 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
23a30 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
23a60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
23a70 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
23a80 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
23a90 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
23aa0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
23ab0 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ad0 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
23ae0 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
23af0 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
23b00 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
23b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23b20 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
23b30 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
23b40 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
23b50 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
23b60 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
23b70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
23b80 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
23b90 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
23ba0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
23bb0 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
23bc0 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
23bd0 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b   int iSpace = 0;
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23bf0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
23c00 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a  te of aSpace[] *
23c10 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
23c20 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
23c30 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
23c40 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
23c50 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
23c60 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
23c70 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
23c80 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
23c90 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
23ca0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
23cb0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
23cc0 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
23cd0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
23ce0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
23cf0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
23d00 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
23d10 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
23d20 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
23d30 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
23d40 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
23d50 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
23d60 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
23d70 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
23d80 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23da0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
23db0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
23dc0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
23dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23de0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
23df0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
23e00 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
23e10 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
23e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
23e30 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
23e40 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
23e50 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
23e60 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
23e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
23e80 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
23e90 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  anced */.  int *
23ea0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
23eb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
23ec0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
23ed0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
23ee0 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
23ef0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
23f00 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f   /* Space for ho
23f10 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70  lding data of ap
23f20 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Copy[] */.  u8 *
23f30 61 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  aSpace;         
23f40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
23f50 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73  e to hold copies
23f60 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
23f70 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ls */.#ifndef SQ
23f80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23f90 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d  CUUM.  u8 *aFrom
23fa0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
23fb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
23fc0 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 50  treeMutexHeld(pP
23fd0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23fe0 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20   );..  /* .  ** 
23ff0 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20  Find the parent 
24000 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
24010 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
24020 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
24030 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24040 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
24050 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65  DbPage) || pPage
24060 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
24070 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
24080 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20  >pBt;.  pParent 
24090 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
240a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
240b0 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ent );.  if( SQL
240c0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
240d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
240e0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
240f0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
24100 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45   rc;.  }.  TRACE
24110 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
24120 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
24130 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
24140 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
24150 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
24160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
24170 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
24180 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
24190 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
241a0 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
241b0 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
241c0 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
241d0 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
241e0 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
241f0 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
24200 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
24210 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
24220 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
24230 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
24240 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
24250 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
24260 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
24270 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
24280 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
24290 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
242a0 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
242b0 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
242c0 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
242d0 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
242e0 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
242f0 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
24300 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
24310 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
24320 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24330 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
24340 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
24350 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24360 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
24370 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
24380 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
24390 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
243a0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
243b0 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
243c0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
243d0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
243e0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
243f0 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
24400 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
24410 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
24420 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
24430 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
24440 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
24450 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
24460 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
24470 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
24480 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
24490 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
244a0 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
244b0 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
244c0 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
244d0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
244e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
244f0 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
24500 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24510 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
24520 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
24530 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
24540 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
24550 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
24560 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
24570 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
24580 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
24590 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
245a0 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
245b0 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
245c0 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
245d0 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
245e0 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
245f0 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69    if( pParent->i
24600 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50  dxShift ){.    P
24610 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  gno pgno;.    pg
24620 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
24630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
24640 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
24650 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
24660 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
24670 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
24680 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
24690 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
246a0 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
246b0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
246c0 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
246d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
246e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
246f0 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
24700 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
24710 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
24720 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
24730 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
24740 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
24750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24760 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
24770 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
24780 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
24790 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
247a0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
247b0 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
247c0 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
247d0 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
247e0 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
247f0 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
24800 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  0;.  sqlite3Page
24810 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
24820 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  bPage);..  /*.  
24830 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
24840 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
24850 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
24860 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
24870 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
24880 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
24890 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
248a0 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
248b0 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
248c0 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
248d0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
248e0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
248f0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
24900 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
24910 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
24920 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
24930 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
24940 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
24950 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
24960 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
24970 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
24980 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
24990 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
249a0 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
249b0 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
249c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
249d0 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
249e0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
249f0 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
24a00 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
24a10 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
24a20 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
24a30 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
24a40 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
24a50 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
24a60 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
24a70 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
24a80 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
24a90 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
24aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
24ab0 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
24ac0 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
24ad0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
24ae0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
24af0 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
24b00 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
24b10 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
24b20 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
24b30 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
24b40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
24b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
24b60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
24b70 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
24b80 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
24b90 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
24ba0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
24bb0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
24bc0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
24bd0 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
24be0 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
24bf0 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
24c00 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
24c10 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
24c20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
24c30 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
24c40 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
24c50 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
24c60 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
24c70 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20  a multiple of 2 
24c80 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
24c90 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
24ca0 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
24cb0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
24cc0 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a  xCells + 1)&~1;.
24cd0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
24ce0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
24cf0 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
24d00 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20    */.  apCell = 
24d10 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
24d20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
24d30 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
24d60 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
24d70 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e 74  Cells*sizeof(int
24d80 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
24d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
24da0 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
24db0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
24dc0 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20 20  mPage))*NB      
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
24df0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
24e00 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20 20  *(5+NB)         
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a     /* aSpace */.
24e30 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
24e40 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
24e50 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20 20   : 0)           
24e60 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
24e70 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 70  */.  );.  if( ap
24e80 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
24e90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24ea0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
24eb0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
24ec0 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
24ed0 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
24ee0 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
24ef0 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
24f00 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
24f10 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
24f20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
24f30 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
24f40 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
24f50 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28  quired */.  for(
24f60 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b  i=1; i<NB; i++){
24f70 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20  .    aCopy[i] = 
24f80 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d  &aCopy[i-1][pBt-
24f90 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
24fa0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
24fb0 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  )];.    assert( 
24fc0 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38  ((aCopy[i] - (u8
24fd0 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
24fe0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
24ff0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
25000 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
25010 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d  e = &aCopy[NB-1]
25020 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
25030 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
25040 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72  Page))];.  asser
25050 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28 75  t( ((aSpace - (u
25060 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
25070 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
25080 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
25090 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ed */.#ifndef SQ
250a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
250b0 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
250c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
250d0 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63    aFrom = &aSpac
250e0 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a  e[5*pBt->pageSiz
250f0 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e];.  }.#endif. 
25100 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
25110 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
25120 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
25130 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
25140 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
25150 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
25160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
25170 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
25180 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
25190 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
251a0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
251b0 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
251c0 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
251d0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
251e0 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
251f0 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
25200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
25210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
25220 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
25230 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
25240 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 61  aCopy[i][pBt->pa
25250 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e  geSize];.    p->
25260 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
25270 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
25280 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
25290 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
252a0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
252b0 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28  geSize + sizeof(
252c0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 2f  MemPage));.    /
252d0 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 61  * The memcpy() a
252e0 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68 65  bove changes the
252f0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44 61   value of p->aDa
25300 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ta so we have to
25310 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20 61  .    ** set it a
25320 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  gain. */.    p->
25330 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
25340 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
25350 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  ];.  }..  /*.  *
25360 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
25370 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
25380 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
25390 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
253a0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
253b0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
253c0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
253d0 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
253e0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
253f0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
25400 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d  ed form aSpace[]
25410 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
25420 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
25430 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
25440 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
25450 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
25460 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
25470 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
25480 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
25490 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
254a0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
254b0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
254c0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
254d0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
254e0 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74   aSpace[].  In t
254f0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
25500 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
25510 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
25520 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
25530 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
25540 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
25550 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
25560 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
25570 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
25580 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
25590 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
255a0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
255b0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
255c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
255d0 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
255e0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
255f0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
25600 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
25610 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
25620 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
25630 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
25640 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
25650 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
25660 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
25670 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
25680 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
25690 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
256a0 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b   && pPage->leaf;
256b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
256c0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
256d0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
256e0 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
256f0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
25700 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
25710 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
25720 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
25730 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25740 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
25750 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
25760 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
25770 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
25780 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
25790 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
257a0 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
257b0 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
257c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
257d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
257e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
257f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
25800 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
25810 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
25820 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
25830 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
25840 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
25850 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
25860 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
25870 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
25880 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
25890 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
258a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
258b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
258c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
258d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
258e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
258f0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
25900 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
25910 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
25920 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
25930 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
25940 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
25950 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
25960 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
25970 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
25980 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
25990 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
259a0 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
259b0 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
259c0 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
259d0 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
259e0 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
259f0 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
25a00 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
25a10 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
25a20 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
25a30 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
25a40 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
25a50 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
25a60 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
25a70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
25a80 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
25a90 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
25aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25ab0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
25ac0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
25ad0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
25ae0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
25af0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
25b00 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
25b10 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
25b20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
25b30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25b40 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
25b50 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
25b60 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
25b70 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
25b80 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
25b90 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
25ba0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
25bb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25bc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25bd0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
25be0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25bf0 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
25c00 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
25c10 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25c20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
25c30 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
25c40 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
25c50 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
25c60 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
25c70 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
25c80 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
25c90 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
25ca0 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
25cb0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
25cc0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
25cd0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
25ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
25cf0 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
25d00 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
25d10 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
25d20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
25d30 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
25d40 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
25d50 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
25d60 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
25d70 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
25d80 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
25d90 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
25da0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
25db0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
25dc0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
25dd0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
25de0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
25df0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
25e00 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
25e10 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
25e20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
25e30 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
25e40 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
25e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25e60 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
25e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25e80 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
25e90 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
25ea0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
25eb0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
25ec0 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
25ed0 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
25ee0 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
25ef0 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
25f00 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
25f10 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
25f20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
25f30 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
25f40 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
25f50 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
25f60 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
25f70 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
25f80 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
25f90 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
25fa0 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
25fb0 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
25fc0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
25fd0 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
25fe0 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
25ff0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
26000 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
26010 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
26020 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
26030 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
26040 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
26050 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
26060 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
26070 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
26080 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
26090 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
260a0 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
260b0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
260c0 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
260d0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
260e0 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
260f0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
26100 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
26110 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
26120 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
26130 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
26140 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
26150 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
26160 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
26170 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
26180 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
26190 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
261a0 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
261b0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
261c0 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
261d0 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
261e0 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
261f0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
26200 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
26210 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
26220 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
26230 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
26240 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
26250 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d        k++;.    }
26260 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
26270 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
26280 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
26290 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
262a0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
262b0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
262c0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
262d0 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
262e0 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
262f0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
26300 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
26310 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
26320 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
26330 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
26340 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
26350 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
26360 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
26370 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
26380 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
26390 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
263a0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
263b0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
263c0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
263d0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
263e0 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
263f0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
26400 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
26410 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
26420 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
26430 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
26440 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
26450 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
26460 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
26470 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
26480 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
26490 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
264a0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
264b0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
264c0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
264d0 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
264e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
264f0 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
26500 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
26510 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
26520 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
26530 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
26540 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
26550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26560 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
26570 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
26580 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
26590 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
265a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
265b0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
265c0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
265d0 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
265e0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
265f0 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
26600 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
26610 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
26620 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
26630 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
26640 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
26650 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
26660 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
26670 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
26680 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
26690 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
266a0 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
266b0 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
266c0 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
266d0 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
266e0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
266f0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
26700 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
26710 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
26720 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
26730 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
26740 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
26750 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
26760 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
26770 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
26780 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65  0])>0) or we are
26790 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74   the.  ** a virt
267a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
267b0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
267c0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
267d0 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
267e0 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
267f0 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
26800 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
26810 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
26820 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
26830 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
26840 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
26850 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
26860 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
26870 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
26880 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
26890 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
268a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
268b0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
268c0 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70  .  pageFlags = p
268d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  Page->aData[0];.
268e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
268f0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
26900 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
26910 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
26920 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
26930 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
26940 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
26950 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  pgnoOld[i];.    
26960 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
26970 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26980 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
26990 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
269a0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
269b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
269c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
269d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269e0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
269f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
26a00 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
26a10 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
26a20 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d  w[i], pgnoNew[i-
26a30 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
26a40 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
26a50 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
26a60 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
26a70 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
26a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f  ;.    }.    zero
26a90 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
26aa0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
26ab0 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
26ac0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
26ad0 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
26ae0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
26af0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
26b00 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
26b10 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
26b20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
26b30 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26b40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
26b50 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
26b60 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
26b70 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
26b80 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
26b90 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
26ba0 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
26bb0 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
26bc0 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
26bd0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
26be0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
26bf0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
26c00 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
26c10 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
26c20 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
26c30 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
26c40 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
26c50 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
26c60 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
26c70 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
26c80 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
26c90 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
26ca0 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
26cb0 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
26cc0 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
26cd0 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
26ce0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
26cf0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
26d00 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
26d10 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
26d20 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
26d30 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
26d40 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
26d50 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
26d60 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
26d70 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
26d80 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
26d90 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
26da0 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
26db0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
26dc0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
26dd0 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
26de0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
26df0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
26e00 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
26e10 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
26e20 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
26e30 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
26e40 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
26e50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26e60 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
26e70 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
26e80 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
26e90 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
26ea0 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
26eb0 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
26ec0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
26ed0 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
26ee0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
26ef0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
26f00 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
26f10 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
26f20 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
26f30 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
26f40 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
26f50 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
26f60 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
26f70 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
26f80 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
26f90 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
26fa0 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
26fb0 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
26fc0 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
26fd0 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
26fe0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
26ff0 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
27000 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
27010 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
27020 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
27030 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
27040 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
27050 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
27060 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
27070 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
27080 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
27090 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
270a0 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
270b0 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
270c0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
270d0 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
270e0 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
270f0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
27100 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
27110 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
27120 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
27130 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
27140 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
27150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
27160 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
27170 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
27180 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
27190 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
271a0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
271b0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
271c0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
271d0 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
271e0 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
271f0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
27200 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
27210 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
27220 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
27230 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
27240 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
27250 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
27260 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
27270 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
27280 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66  w==0 );..#ifndef
27290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
272a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
272b0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
272c0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
272d0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
272e0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
272f0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
27300 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
27310 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
27320 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
27330 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
27340 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
27350 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
27360 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
27370 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
27380 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
27390 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
273a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
273b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
273c0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
273d0 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
273e0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
273f0 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
27400 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
27410 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
27420 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
27430 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
27440 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
27450 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
27460 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
27470 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27490 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
274a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
274b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
274c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
274d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
274e0 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
274f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
27500 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
27510 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
27520 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
27530 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
27540 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
27550 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
27560 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
27570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27580 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
27590 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
275a0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
275b0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
275c0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
275d0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
275e0 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
275f0 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
27600 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
27610 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
27620 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
27630 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
27640 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
27650 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
27660 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
27670 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
27680 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
27690 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
276a0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
276b0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
276c0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
276d0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
276e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
276f0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
27700 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
27710 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
27720 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
27730 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
27740 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
27750 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
27760 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
27770 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
27780 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
27790 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
277a0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
277b0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
277c0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
277d0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
277e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
277f0 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
27800 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
27810 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
27820 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
27830 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e  ;.        fillIn
27840 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43  Cell(pParent, pC
27850 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
27860 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29  y, 0, 0, 0, &sz)
27870 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
27880 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
27890 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
278a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
278b0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
278c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
278d0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
278e0 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70   -= 4;.        p
278f0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
27900 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
27910 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
27920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
27930 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
27940 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
27950 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
27960 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
27970 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
27980 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
27990 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
279a0 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
279b0 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
279c0 61 6e 64 20 69 74 27 73 20 72 65 70 6f 72 74 65  and it's reporte
279d0 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
279e0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
279f0 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
27a00 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
27a10 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
27a20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65    ** (see sqlite
27a30 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
27a40 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
27a50 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
27a60 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
27a70 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
27a80 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
27a90 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
27aa0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
27ab0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
27ac0 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
27ad0 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
27ae0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
27af0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
27b00 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
27b10 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
27b20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
27b30 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
27b40 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
27b50 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
27b60 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
27b70 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
27b80 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
27b90 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
27ba0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
27bb0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
27bc0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
27bd0 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
27be0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
27bf0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
27c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
27c10 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
27c20 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
27c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27c40 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
27c50 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
27c60 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
27c70 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
27c80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27c90 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
27ca0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27cb0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
27cc0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
27cd0 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
27ce0 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  w->pgno);.#ifnde
27cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27d00 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
27d10 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
27d20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
27d30 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
27d40 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
27d50 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
27d60 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
27d70 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
27d80 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
27d90 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
27da0 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
27db0 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
27dc0 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
27dd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27de0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
27df0 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74  cuum && !leafDat
27e00 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
27e10 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
27e20 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
27e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
27e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27e50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
27e60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27e80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b  #endif.      j++
27e90 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
27ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
27eb0 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
27ec0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
27ed0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
27ee0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
27ef0 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
27f00 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
27f10 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
27f20 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
27f30 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
27f40 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
27f50 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d    }.  if( nxDiv=
27f60 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
27f70 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
27f80 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
27f90 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
27fa0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
27fb0 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
27fc0 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
27fd0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
27fe0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
27ff0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
28000 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
28010 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
28020 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
28030 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
28040 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
28050 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
28060 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
28070 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
28080 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
28090 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
280a0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
280b0 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
280c0 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
280d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72  .  /*.  ** Repar
280e0 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  ent children of 
280f0 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  all cells..  */.
28100 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
28110 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  w; i++){.    rc 
28120 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
28130 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  ages(apNew[i]);.
28140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28150 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
28160 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28170 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e  }.  rc = reparen
28180 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72  tChildPages(pPar
28190 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
281a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
281b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
281c0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  ;..  /*.  ** Bal
281d0 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
281e0 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
281f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
28200 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
28210 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
28220 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
28230 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
28240 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
28250 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
28260 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
28270 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
28280 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
28290 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
282a0 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
282b0 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
282c0 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
282d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
282e0 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
282f0 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
28300 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
28310 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
28320 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
28330 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
28340 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
28350 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
28360 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
28370 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
28380 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
28390 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
283a0 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41  (pParent);.  TRA
283b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
283c0 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
283d0 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
283e0 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
283f0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
28400 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
28410 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell));.  return 
28420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
28430 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
28440 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
28450 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
28460 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
28470 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
28480 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
28490 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
284a0 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
284b0 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
284c0 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
284d0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
284e0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
284f0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
28500 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
28510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28520 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
28530 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
28540 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
28550 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
28560 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
28570 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
28580 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28590 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
285a0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
285b0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
285c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
285d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
285e0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
285f0 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
28600 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
28610 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
28620 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
28630 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
28640 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
28650 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
28660 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
28670 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
28680 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
28690 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20  .  int *szCell; 
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
286c0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
286d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
286e0 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
286f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
28700 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
28710 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
28720 65 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65  eMutexHeld(pPage
28730 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
28740 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
28750 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72  pBt;.  mxCellPer
28760 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70  Page = MX_CELL(p
28770 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  Bt);.  apCell = 
28780 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
28790 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73  mxCellPerPage*(s
287a0 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f  izeof(u8*)+sizeo
287b0 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28  f(int)) );.  if(
287c0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74   apCell==0 ) ret
287d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
287e0 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e  ;.  szCell = (in
287f0 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c  t*)&apCell[mxCel
28800 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28  lPerPage];.  if(
28810 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
28820 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
28830 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
28840 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43  mpty */.    TRAC
28850 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70  E(("BALANCE: emp
28860 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20  ty table %d\n", 
28870 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
28880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
28890 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
288a0 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e  empty but has on
288b0 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66  e child.  Transf
288c0 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e  er the.    ** in
288d0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
288e0 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e  hat one child in
288f0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
28900 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77   if it .    ** w
28910 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72  ill fit.  This r
28920 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68  educes the depth
28930 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20   of the tree by 
28940 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
28950 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
28960 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69  age is page 1, i
28970 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65  t has less space
28980 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a   available than.
28990 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64      ** its child
289a0 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30   (due to the 100
289b0 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61   byte header tha
289c0 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
289d0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
289e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
289f0 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67   fle), so it mig
28a00 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ht not be able t
28a10 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68  o hold all of th
28a20 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  e .    ** inform
28a30 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ation currently 
28a40 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
28a50 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73   child.  If this
28a60 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   is the .    ** 
28a70 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  case, then do no
28a80 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65  t do the transfe
28a90 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31  r.  Leave page 1
28aa0 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20   empty except.  
28ab0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67    ** for the rig
28ac0 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ht-pointer to th
28ad0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  e child page.  T
28ae0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65  he child page be
28af0 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  comes.    ** the
28b00 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66   virtual root of
28b10 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a   the tree..    *
28b20 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  /.    pgnoChild 
28b30 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
28b40 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
28b50 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
28b60 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
28b70 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73  hild>0 );.    as
28b80 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c  sert( pgnoChild<
28b90 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
28ba0 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42  ecount(pPage->pB
28bb0 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
28bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
28bd0 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67 65  reeGetPage(pPage
28be0 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  ->pBt, pgnoChild
28bf0 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20  , &pChild, 0);. 
28c00 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28c10 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
28c20 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50  ance;.    if( pP
28c30 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  age->pgno==1 ){.
28c40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28c50 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
28c60 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
28c70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
28c80 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
28c90 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61  balance;.      a
28ca0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
28cb0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
28cc0 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d       if( pChild-
28cd0 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20  >nFree>=100 ){. 
28ce0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
28cf0 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ild information 
28d00 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
28d10 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f  root page, so do
28d20 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28d30 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  copy */.        
28d40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a  int i;.        z
28d50 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
28d60 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29  Child->aData[0])
28d70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
28d80 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
28d90 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
28da0 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20      apCell[i] = 
28db0 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c  findCell(pChild,
28dc0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  i);.          sz
28dd0 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  Cell[i] = cellSi
28de0 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70  zePtr(pChild, ap
28df0 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Cell[i]);.      
28e00 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
28e10 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20  mblePage(pPage, 
28e20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61  pChild->nCell, a
28e30 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a  pCell, szCell);.
28e40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
28e50 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
28e60 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74  r of the child t
28e70 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
28e80 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
28e90 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
28ea0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28eb0 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  +8], .          
28ec0 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69    get4byte(&pChi
28ed0 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64  ld->aData[pChild
28ee0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
28ef0 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61  ;.        freePa
28f00 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
28f10 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
28f20 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72  NCE: child %d tr
28f30 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31  ansfer to page 1
28f40 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
28f50 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  o));.      }else
28f60 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
28f70 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20   child has more 
28f80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
28f90 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
28fa0 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a   root..        *
28fb0 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c  * The tree is al
28fc0 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20  ready balanced. 
28fd0 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   Do nothing. */.
28fe0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28ff0 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
29000 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  d will not fit o
29010 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  n page 1\n", pCh
29020 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
29030 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
29050 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c  ge->aData, pChil
29060 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d  d->aData, pPage-
29070 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
29080 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
29090 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
290a0 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
290b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
290c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
290d0 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
290e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
290f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
29100 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
29110 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52  Child);.      TR
29120 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74  ACE(("BALANCE: t
29130 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64  ransfer child %d
29140 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22   into root %d\n"
29150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29160 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50  pChild->pgno, pP
29170 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
29180 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61   }.    rc = repa
29190 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
291a0 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Page);.    asser
291b0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
291c0 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  low==0 );.#ifnde
291d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
291e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
291f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
29200 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
29210 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
29220 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
29230 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72  i++){ .        r
29240 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29250 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
29260 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29280 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61      goto end_sha
29290 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
292a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
292b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
292c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
292d0 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68  ild);.  }.end_sh
292e0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20  allow_balance:. 
292f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70   sqlite3_free(ap
29300 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
29310 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
29320 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
29330 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
29340 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
29350 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
29360 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
29370 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
29380 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
29390 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
293a0 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
293b0 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
293c0 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
293d0 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
293e0 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
293f0 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
29400 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
29410 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
29420 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
29430 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
29440 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
29450 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
29460 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
29470 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
29480 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29490 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
294a0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
294b0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
294c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
294d0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
294e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
294f0 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
29500 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
29510 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
29520 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
29530 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
29540 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
29550 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
29560 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
29570 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
29580 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
29590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
295a0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
295b0 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
295c0 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
295d0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
295e0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
295f0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
29600 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
29610 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
29620 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
29630 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
29640 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29650 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
29660 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
29670 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
29680 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
29690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
296a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
296b0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
296c0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
296d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
296e0 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  exHeld(pBt->mute
296f0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c  x) );.  rc = all
29700 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
29710 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67  Bt, &pChild, &pg
29720 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e  noChild, pPage->
29730 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20  pgno, 0);.  if( 
29740 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29760 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29770 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
29780 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  e) );.  usableSi
29790 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
297a0 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70  Size;.  data = p
297b0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
297c0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
297d0 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67  ffset;.  brk = g
297e0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
297f0 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
29800 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
29810 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
29820 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
29830 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
29840 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
29850 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
29860 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62  ta[brk], &data[b
29870 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d  rk], usableSize-
29880 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  brk);.  assert( 
29890 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d  pChild->isInit==
298a0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
298b0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
298c0 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
298d0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
298e0 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
298f0 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68  ut;.  memcpy(pCh
29900 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  ild->aOvfl, pPag
29910 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  e->aOvfl, pPage-
29920 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
29930 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
29940 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e  ]));.  pChild->n
29950 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65  Overflow = pPage
29960 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69  ->nOverflow;.  i
29970 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
29980 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69  flow ){.    pChi
29990 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ld->nFree = 0;. 
299a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68   }.  assert( pCh
299b0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67  ild->nCell==pPag
299c0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65  e->nCell );.  ze
299d0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
299e0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
299f0 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
29a00 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
29a10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
29a20 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
29a30 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28  hild);.  TRACE((
29a40 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
29a50 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
29a60 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
29a70 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
29a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29a90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29aa0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
29ab0 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  cuum ){.    int 
29ac0 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  i;.    rc = ptrm
29ad0 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c  apPut(pBt, pChil
29ae0 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  d->pgno, PTRMAP_
29af0 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67  BTREE, pPage->pg
29b00 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
29b10 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
29b20 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f  eper_out;.    fo
29b30 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
29b40 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
29b50 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29b60 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69  utOvfl(pChild, i
29b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29bb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d   }.#endif.  rc =
29bc0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
29bd0 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e  (pChild);..balan
29be0 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20  cedeeper_out:.  
29bf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
29c00 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ld);.  return rc
29c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64  ;.}../*.** Decid
29c20 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50  e if the page pP
29c30 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
29c40 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61  balanced.  If ba
29c50 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65  lancing is.** re
29c60 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65  quired, call the
29c70 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
29c80 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  ancing routine..
29c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
29ca0 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  lance(MemPage *p
29cb0 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74  Page, int insert
29cc0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
29cd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
29ce0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
29cf0 75 74 65 78 48 65 6c 64 28 70 50 61 67 65 2d 3e  utexHeld(pPage->
29d00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29d10 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
29d20 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ent==0 ){.    rc
29d30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29d40 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
29d50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29d70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
29d80 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
29d90 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
29da0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
29db0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29dc0 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  OK && pPage->nCe
29dd0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ll==0 ){.      r
29de0 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  c = balance_shal
29df0 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20  lower(pPage);.  
29e00 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
29e10 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
29e20 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20  rflow>0 || .    
29e30 20 20 20 20 28 21 69 6e 73 65 72 74 20 26 26 20      (!insert && 
29e40 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61  pPage->nFree>pPa
29e50 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
29e60 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20  ize*2/3) ){.    
29e70 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
29e80 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20  onroot(pPage);. 
29e90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29ea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
29eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
29ec0 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74  ks all cursors t
29ed0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62  hat point to tab
29ee0 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20  le pgnoRoot..** 
29ef0 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  If any of those 
29f00 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65  cursors were ope
29f10 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
29f20 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  =0 in a differen
29f30 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
29f40 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61  nnection (a data
29f50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
29f60 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65 20  that shares the 
29f70 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77  pager.** cache w
29f80 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
29f90 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20  connection) and 
29fa0 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65  that other conne
29fb0 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74  ction .** is not
29fc0 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f   in the ReadUnco
29fd0 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20  mmmitted state, 
29fe0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
29ff0 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  e returns .** SQ
2a000 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a  LITE_LOCKED..**.
2a010 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  ** In addition t
2a020 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72  o checking for r
2a030 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65  ead-locks (where
2a040 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a   a read-lock .**
2a050 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20   means a cursor 
2a060 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
2a070 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74  ag==0) this rout
2a080 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a  ine also moves.*
2a090 2a 20 61 6c 6c 20 77 72 69 74 65 20 63 75 72 73  * all write curs
2a0a0 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ors so that they
2a0b0 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f   are pointing to
2a0c0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43   the .** first C
2a0d0 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ell on the root 
2a0e0 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6e  page.  This is n
2a0f0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
2a100 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f   an insert .** o
2a110 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20 63  r delete might c
2a120 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72  hange the number
2a130 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70   of cells on a p
2a140 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a  age or delete.**
2a150 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c 79   a page entirely
2a160 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77   and we do not w
2a170 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e 79  ant to leave any
2a180 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69   cursors .** poi
2a190 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69  nting to non-exi
2a1a0 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20 63  stant pages or c
2a1b0 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
2a1c0 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  int checkReadLoc
2a1d0 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ks(Btree *pBtree
2a1e0 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c  , Pgno pgnoRoot,
2a1f0 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c   BtCursor *pExcl
2a200 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ude){.  BtCursor
2a210 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
2a220 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
2a230 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
2a240 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53 71 6c  b = pBtree->pSql
2a250 69 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ite;.  assert( s
2a260 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
2a270 48 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  Held(pBt->mutex)
2a280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a290 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
2a2a0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
2a2b0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2a2c0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
2a2d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
2a2e0 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f  p==pExclude ) co
2a2f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2a300 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  p->eState!=CURSO
2a310 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e  R_VALID ) contin
2a320 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
2a330 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
2a340 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2a350 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d    if( p->wrFlag=
2a360 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2a370 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70  te3 *dbOther = p
2a380 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
2a390 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f  e;.      if( dbO
2a3a0 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  ther==0 ||.     
2a3b0 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62      (dbOther!=db
2a3c0 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c   && (dbOther->fl
2a3d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2a3e0 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30  dUncommitted)==0
2a3f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2a400 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2a410 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
2a420 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61 67  else if( p->pPag
2a430 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f  e->pgno!=p->pgno
2a440 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f  Root ){.      mo
2a450 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20  veToRoot(p);.   
2a460 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a480 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2a490 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2a4a0 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
2a4b0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
2a4c0 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
2a4d0 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
2a4e0 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
2a4f0 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
2a500 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
2a510 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
2a520 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
2a530 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
2a540 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
2a550 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2a560 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2a570 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2a580 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
2a590 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
2a5a0 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
2a5b0 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
2a5c0 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
2a5d0 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
2a5e0 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
2a5f0 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
2a600 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
2a610 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2a620 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
2a630 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a650 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
2a660 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
2a670 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
2a680 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
2a690 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
2a6a0 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
2a6b0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
2a6c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2a6d0 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
2a6e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
2a6f0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
2a700 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a730 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
2a740 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
2a750 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
2a760 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20  Bias            
2a770 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a780 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
2a790 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  n append */.){. 
2a7a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
2a7b0 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b  oc;.  int szNew;
2a7c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a7d0 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  e;.  Btree *p = 
2a7e0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2a7f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a800 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
2a810 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
2a820 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2a830 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
2a840 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
2a850 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
2a860 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2a870 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
2a880 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
2a890 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2a8a0 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
2a8b0 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  n insert */.    
2a8c0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2a8d0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2a8e0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2a8f0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
2a900 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2a910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2a920 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2a930 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2a940 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2a950 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
2a960 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2a970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a980 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
2a990 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
2a9a0 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2a9b0 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2a9c0 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2a9d0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2a9e0 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 73  , pCur) ){.    s
2a9f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2aa00 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
2aa10 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
2aa20 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
2aa30 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
2aa40 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
2aa50 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
2aa60 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2aa70 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2aa80 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
2aa90 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72  le */.  clearCur
2aaa0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2aab0 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51  );.  if( .    SQ
2aac0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2aad0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2aae0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2aaf0 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20  t, pCur)) ||.   
2ab00 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2ab10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2ab20 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
2ab30 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
2ab40 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20  s, &loc)).  ){. 
2ab50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
2ab60 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
2ab70 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
2ab80 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2ab90 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
2aba0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e  age->intKey || n
2abb0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
2abc0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2abd0 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44  || !pPage->leafD
2abe0 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28  ata );.  TRACE((
2abf0 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
2ac00 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
2ac10 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
2ac20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
2ac30 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
2ac40 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
2ac50 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
2ac60 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
2ac70 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
2ac80 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
2ac90 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2aca0 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73  );.  newCell = s
2acb0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 4d  qlite3_malloc( M
2acc0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2acd0 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c   );.  if( newCel
2ace0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2acf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
2ad00 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
2ad10 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
2ad20 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
2ad30 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
2ad40 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
2ad50 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2ad60 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
2ad70 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
2ad80 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
2ad90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
2ada0 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
2adb0 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20  E(pBt) );.  if( 
2adc0 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52  loc==0 && CURSOR
2add0 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2ade0 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tate ){.    int 
2adf0 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72  szOld;.    asser
2ae00 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
2ae10 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
2ae20 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2ae30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ae40 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2ae50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2ae60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
2ae70 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2ae80 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
2ae90 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2aea0 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2aeb0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2aec0 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
2aed0 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
2aee0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
2aef0 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
2af00 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
2af10 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
2af20 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2af30 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
2af40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2af50 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72  d_insert;.    dr
2af60 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
2af70 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b  ur->idx, szOld);
2af80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
2af90 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
2afa0 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
2afb0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2afc0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  );.    pCur->idx
2afd0 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  ++;.    pCur->in
2afe0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2aff0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2b000 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2b010 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73  ;.  }.  rc = ins
2b020 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2b030 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c  Cur->idx, newCel
2b040 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
2b050 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2b060 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
2b070 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62  insert;.  rc = b
2b080 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29  alance(pPage, 1)
2b090 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74  ;.  /* sqlite3Bt
2b0a0 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72  reePageDump(pCur
2b0b0 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2b0c0 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20  oRoot, 1); */.  
2b0d0 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  /* fflush(stdout
2b0e0 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ); */.  if( rc==
2b0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b100 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2b110 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2b120 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
2b130 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 73 71  e(newCell);.  sq
2b140 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2b150 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2b160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2b170 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2b180 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
2b190 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
2b1a0 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
2b1b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2b1c0 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
2b1d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2b1e0 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72  treeDelete(BtCur
2b1f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2b200 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2b210 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e  Cur->pPage;.  un
2b220 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2b230 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ll;.  int rc;.  
2b240 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
2b250 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d   0;.  Btree *p =
2b260 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
2b270 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2b280 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
2b290 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
2b2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b2b0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2b2c0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2b2d0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2b2e0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2b2f0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2b300 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2b310 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20  ng a delete */. 
2b320 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2b330 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2b340 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2b350 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
2b360 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2b370 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2b380 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2b390 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2b3a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2b3b0 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2b3c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
2b3d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2b3e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b3f0 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63  ERROR;  /* The c
2b400 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2b410 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e  nting to anythin
2b420 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21  g */.  }.  if( !
2b430 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
2b440 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b450 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
2b460 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2b470 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f  ;   /* Did not o
2b480 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20  pen this cursor 
2b490 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2b4a0 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2b4b0 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2b4c0 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2b4d0 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20  Root, pCur) ){. 
2b4e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
2b4f0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
2b500 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2b510 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
2b520 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
2b530 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
2b540 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
2b550 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2b560 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
2b570 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
2b580 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
2b590 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
2b5a0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
2b5b0 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
2b5c0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2b5d0 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
2b5e0 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
2b5f0 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
2b600 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
2b610 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
2b620 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
2b630 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
2b640 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
2b650 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
2b660 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
2b670 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2b680 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
2b690 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
2b6a0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2b6b0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2b6c0 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2b6d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b6e0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2b6f0 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
2b700 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
2b710 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
2b720 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2b730 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
2b740 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61  l within it's pa
2b750 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
2b760 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
2b770 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
2b780 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
2b790 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
2b7a0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2b7b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
2b7c0 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
2b7d0 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
2b7e0 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
2b7f0 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2b800 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2b810 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50  >idx);.  if( !pP
2b820 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b830 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2b840 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2b850 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2b860 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2b870 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2b880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2b890 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
2b8a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
2b8b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2b8c0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2b8d0 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65  The entry we are
2b8e0 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65   about to delete
2b8f0 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73   is not a leaf s
2b900 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20  o if we do not. 
2b910 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69     ** do somethi
2b920 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ng we will leave
2b930 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e   a hole on an in
2b940 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20  ternal page..   
2b950 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66   ** We have to f
2b960 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20  ill the hole by 
2b970 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c  moving in a cell
2b980 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54   from a leaf.  T
2b990 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43  he.    ** next C
2b9a0 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e  ell after the on
2b9b0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
2b9c0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2b9d0 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a   exist and.    *
2b9e0 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73  * to be a leaf s
2b9f0 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e  o we can use it.
2ba00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75  .    */.    BtCu
2ba10 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20  rsor leafCur;.  
2ba20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2ba30 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  *pNext;.    int 
2ba40 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20  szNext;  /* The 
2ba50 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
2ba60 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78   is wrong: szNex
2ba70 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20  t is always .   
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2ba90 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66   initialized bef
2baa0 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67  ore use.  Adding
2bab0 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61   an extra initia
2bac0 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  lization.       
2bad0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
2bae0 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70  silence the comp
2baf0 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20  iler slows down 
2bb00 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  the code. */.   
2bb10 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
2bb20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2bb30 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20  *tempCell = 0;. 
2bb40 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2bb50 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20  e->leafData );. 
2bb60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
2bb70 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75  etTempCursor(pCu
2bb80 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  r, &leafCur);.  
2bb90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2bba0 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
2bbb0 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
2bbc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bbd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2bbe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2bbf0 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  te(leafCur.pPage
2bc00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bc10 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2bc20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bc30 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2bc40 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2bc50 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25   internal from %
2bc60 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c  d replace from l
2bc70 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
2bc80 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2bc90 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ot, pPage->pgno,
2bca0 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e   leafCur.pPage->
2bcb0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72  pgno));.      dr
2bcc0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
2bcd0 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ur->idx, cellSiz
2bce0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2bcf0 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
2bd00 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66   = findCell(leaf
2bd10 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43  Cur.pPage, leafC
2bd20 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73  ur.idx);.      s
2bd30 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65  zNext = cellSize
2bd40 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67  Ptr(leafCur.pPag
2bd50 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  e, pNext);.     
2bd60 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
2bd70 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65  _SIZE(pBt)>=szNe
2bd80 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65  xt+4 );.      te
2bd90 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  mpCell = sqlite3
2bda0 5f 6d 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c  _malloc( MX_CELL
2bdb0 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
2bdc0 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c      if( tempCell
2bdd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2bde0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2bdf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2be00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2be10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2be20 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2be30 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2be40 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
2be50 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
2be60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2be70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2be80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2be90 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2bea0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2beb0 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  x), pgnoChild);.
2bec0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2bed0 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2bee0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2bef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bf00 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66     dropCell(leaf
2bf10 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43  Cur.pPage, leafC
2bf20 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b  ur.idx, szNext);
2bf30 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2bf40 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  nce(leafCur.pPag
2bf50 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
2bf60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 74 65   sqlite3_free(te
2bf70 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  mpCell);.    sql
2bf80 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
2bf90 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66  TempCursor(&leaf
2bfa0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2bfb0 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2bfc0 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2bfd0 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  te from leaf %d\
2bfe0 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d  n",.       pCur-
2bff0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2c000 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72  ->pgno));.    dr
2c010 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
2c020 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ur->idx, cellSiz
2c030 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2c040 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61  l));.    rc = ba
2c050 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b  lance(pPage, 0);
2c060 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2c070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c080 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2c090 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
2c0a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2c0b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c0c0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2c0d0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
2c0e0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
2c0f0 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
2c100 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
2c110 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2c120 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
2c130 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
2c140 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2c150 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
2c160 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
2c170 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
2c180 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
2c190 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
2c1a0 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
2c1b0 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
2c1c0 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
2c1d0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
2c1e0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
2c1f0 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
2c200 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
2c210 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
2c220 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
2c230 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
2c240 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
2c250 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
2c260 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
2c270 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
2c280 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
2c290 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
2c2a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2c2b0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
2c2c0 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
2c2d0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
2c2e0 63 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  c;..  if( pBt->i
2c2f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2c300 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2c310 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2c320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2c330 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  st */.    rc = p
2c340 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2c350 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2c360 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c370 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c380 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2c390 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
2c3a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2c3b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
2c3c0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2c3d0 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
2c3e0 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
2c3f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
2c400 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c410 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
2c420 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2c430 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2c440 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
2c450 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
2c460 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2c470 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
2c480 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2c490 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
2c4a0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
2c4b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
2c4c0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
2c4d0 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
2c4e0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
2c4f0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
2c500 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
2c510 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
2c520 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
2c530 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
2c540 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
2c550 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
2c560 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
2c570 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
2c580 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
2c590 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
2c5a0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
2c5b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
2c5c0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
2c5d0 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
2c5e0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
2c5f0 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
2c600 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2c610 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2c620 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
2c630 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2c640 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
2c650 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
2c660 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2c670 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
2c680 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
2c690 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2c6a0 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
2c6b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2c6c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2c6d0 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f  Meta(p, 4, &pgno
2c6e0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
2c6f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c710 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52  .    }.    pgnoR
2c720 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
2c730 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2c740 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
2c750 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
2c760 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
2c770 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
2c780 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
2c790 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
2c7a0 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41  oRoot==PTRMAP_PA
2c7b0 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f  GENO(pBt, pgnoRo
2c7c0 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70  ot) ||.        p
2c7d0 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47  gnoRoot==PENDING
2c7e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2c7f0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  ){.      pgnoRoo
2c800 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t++;.    }.    a
2c810 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e  ssert( pgnoRoot>
2c820 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  =3 );..    /* Al
2c830 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54  locate a page. T
2c840 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72  he page that cur
2c850 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61  rently resides a
2c860 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a  t pgnoRoot will.
2c870 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20      ** be moved 
2c880 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2c890 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68   page (unless th
2c8a0 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2c8b0 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
2c8c0 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e  to reside at pgn
2c8d0 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20  oRoot)..    */. 
2c8e0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2c8f0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2c900 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
2c910 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
2c920 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
2c930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c940 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c950 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
2c960 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
2c970 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f  ){.      /* pgno
2c980 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65  Root is the page
2c990 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
2c9a0 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ed for the root-
2c9b0 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  page of.      **
2c9c0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
2c9d0 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f  assuming an erro
2c9e0 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29  r did not occur)
2c9f0 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20  . But we were.  
2ca00 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2ca10 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65   pgnoMove. If re
2ca20 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20  quired (i.e. if 
2ca30 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63  it was not alloc
2ca40 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ated.      ** by
2ca50 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66   extending the f
2ca60 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e  ile), the curren
2ca70 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69  t page at positi
2ca80 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20  on pgnoMove.    
2ca90 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
2caa0 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20  journaled..     
2cab0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79   */.      u8 eTy
2cac0 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
2cad0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
2cae0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2caf0 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f  eMove);..      /
2cb00 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
2cb10 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e  currently at pgn
2cb20 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76  oRoot to pgnoMov
2cb30 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
2cb40 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2cb50 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
2cb60 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
2cb70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2cb80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cb90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cba0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2cbb0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2cbc0 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
2cbd0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
2cbe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cbf0 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d  TE_OK || eType==
2cc00 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2cc10 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2cc20 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2cc30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2cc40 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2cc50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cc60 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2cc70 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
2cc80 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
2cc90 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
2cca0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2ccb0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2ccc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ccd0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2cce0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ccf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cd00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2cd10 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2cd20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cd30 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72    }.      rc = r
2cd40 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
2cd50 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
2cd60 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
2cd70 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
2cd80 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
2cd90 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
2cda0 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
2cdb0 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
2cdc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cdd0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2cde0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2cdf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ce00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ce10 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2ce20 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2ce30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ce40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ce50 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2ce60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ce70 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2ce80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ce90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2ceb0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2cec0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ced0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2cee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
2cef0 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
2cf00 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
2cf10 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
2cf20 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
2cf30 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
2cf40 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
2cf50 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
2cf60 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2cf70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
2cf80 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
2cf90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2cfa0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2cfb0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2cfc0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2cfd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2cfe0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
2cff0 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
2d000 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d010 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d020 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2d030 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2d040 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2d050 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2d060 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2d070 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2d080 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2d090 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2d0a0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
2d0b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d0c0 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
2d0d0 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
2d0e0 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
2d0f0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2d100 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d110 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
2d120 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
2d130 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
2d140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d150 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
2d160 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
2d170 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2d180 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2d190 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
2d1a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2d1b0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
2d1c0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
2d1d0 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
2d1e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
2d1f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2d200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d210 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2d220 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2d230 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2d240 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2d250 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2d260 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2d270 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2d280 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2d290 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2d2a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2d2b0 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2d2c0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2d2d0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2d2e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2d2f0 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2d300 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2d310 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2d320 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2d330 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2d340 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2d350 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2d360 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2d370 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2d380 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2d390 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2d3a0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2d3b0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
2d3c0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2d3d0 4d 75 74 65 78 48 65 6c 64 28 70 42 74 2d 3e 6d  MutexHeld(pBt->m
2d3e0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2d3f0 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72  gno>sqlite3Pager
2d400 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
2d410 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
2d420 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d430 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
2d440 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2d450 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
2d460 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  &pPage, pParent)
2d470 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2d480 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2d490 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69  age_out;.  for(i
2d4a0 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
2d4b0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  ll; i++){.    pC
2d4c0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2d4d0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
2d4e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d4f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65  {.      rc = cle
2d500 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2d510 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
2d520 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  ll), pPage->pPar
2d530 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ent, 1);.      i
2d540 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2d550 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2d560 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
2d570 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2d580 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2d590 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2d5a0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2d5b0 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
2d5c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2d5d0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2d5e0 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
2d5f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2d600 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65  aData[8]), pPage
2d610 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20  ->pParent, 1);. 
2d620 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d630 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2d640 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2d650 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29  ( freePageFlag )
2d660 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2d670 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65  age(pPage);.  }e
2d680 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
2d690 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d6a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2d6b0 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50  ==0 ){.    zeroP
2d6c0 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
2d6d0 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
2d6e0 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
2d6f0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2d700 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2d710 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
2d720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d730 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
2d740 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
2d750 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
2d760 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61  e database.  iTa
2d770 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61  ble is.** the pa
2d780 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2d790 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2d7a0 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  le.  After this 
2d7b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c  routine returns,
2d7c0 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
2d7d0 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20  e is empty, but 
2d7e0 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a  still exists..**
2d7f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d800 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2d810 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2d820 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2d830 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73  pen.** read curs
2d840 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2d850 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75  .  Open write cu
2d860 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20  rsors are moved 
2d870 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f  to the.** root o
2d880 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  f the table..*/.
2d890 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d8a0 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
2d8b0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2d8c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
2d8d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2d8e0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
2d8f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2d900 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2d910 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2d920 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2d930 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2d940 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2d950 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
2d960 69 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52  if( (rc = checkR
2d970 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
2d980 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49 54 45 5f  le, 0))!=SQLITE_
2d990 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  OK ){.    /* not
2d9a0 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
2d9b0 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
2d9c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2d9d0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
2d9e0 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
2d9f0 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
2da00 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  do */.  }else{. 
2da10 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2da20 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28  abasePage(pBt, (
2da30 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20  Pgno)iTable, 0, 
2da40 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
2da50 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2da60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2da70 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2da80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2da90 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2daa0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2dab0 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2dac0 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2dad0 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2dae0 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2daf0 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2db00 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2db10 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2db20 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2db30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2db40 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2db50 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2db60 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2db70 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2db80 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2db90 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2dba0 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2dbb0 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2dbc0 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2dbd0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2dbe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2dbf0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2dc00 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2dc10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dc20 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2dc30 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2dc40 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2dc50 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2dc60 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2dc70 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2dc80 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2dc90 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2dca0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2dcb0 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2dcc0 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2dcd0 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2dce0 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2dcf0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2dd00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2dd10 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2dd20 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2dd30 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2dd40 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2dd50 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2dd60 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2dd70 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2dd80 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2dd90 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2dda0 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2ddb0 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2ddc0 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2ddd0 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2dde0 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2ddf0 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2de00 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2de10 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2de20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2de30 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2de40 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dure..*/.static 
2de50 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62  int btreeDropTab
2de60 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2de70 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2de80 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2de90 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2dea0 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2deb0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2dec0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2ded0 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
2dee0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2def0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
2df00 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2df10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2df20 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2df30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2df40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2df50 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
2df60 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
2df70 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
2df80 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
2df90 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2dfa0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
2dfb0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
2dfc0 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
2dfd0 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
2dfe0 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
2dff0 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
2e000 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
2e010 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
2e020 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
2e030 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
2e040 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
2e050 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
2e060 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
2e070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2e080 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
2e090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2e0a0 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
2e0b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2e0c0 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
2e0d0 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
2e0e0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2e0f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
2e100 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2e110 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
2e120 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  le);.  if( rc ){
2e130 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2e140 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
2e150 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
2e160 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
2e170 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
2e180 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2e190 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e1a0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2e1b0 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
2e1c0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2e1d0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
2e1e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2e1f0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
2e200 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
2e210 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e220 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d  GetMeta(p, 4, &m
2e230 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
2e240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e260 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2e270 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2e280 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2e290 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
2e2a0 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
2e2b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2e2c0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2e2d0 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
2e2e0 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
2e2f0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2e300 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2e310 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2e320 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
2e330 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
2e340 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
2e350 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
2e360 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2e370 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e380 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2e390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e3a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e3b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2e3d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2e3e0 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
2e3f0 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
2e400 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
2e410 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2e420 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
2e430 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
2e440 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
2e450 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
2e460 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
2e470 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
2e480 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
2e490 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e4a0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
2e4b0 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
2e4c0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2e4d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2e4e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2e4f0 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
2e500 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
2e510 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2e520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e530 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2e540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e550 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
2e560 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
2e570 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
2e580 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20  E, 0, iTable);. 
2e590 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2e5a0 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2e5b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e5c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e5d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2e5f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e600 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  GetPage(pBt, max
2e610 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2e620 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2e630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2e650 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2e660 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  }.        rc = f
2e670 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  reePage(pMove);.
2e680 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e690 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2e6a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e6b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e6c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e6e0 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f  *piMoved = maxRo
2e6f0 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  otPgno;.      }.
2e700 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
2e710 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d  e new 'max-root-
2e720 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74  page' value in t
2e730 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
2e740 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  er. This.      *
2e750 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c  * is the old val
2e760 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73  ue less one, les
2e770 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68  s one more if th
2e780 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20  at happens to.  
2e790 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74      ** be a root
2e7a0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65  -page number, le
2e7b0 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20  ss one again if 
2e7c0 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20  that is the.    
2e7d0 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2e7e0 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f  E_PAGE..      */
2e7f0 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67  .      maxRootPg
2e800 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  no--;.      if( 
2e810 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e  maxRootPgno==PEN
2e820 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2e830 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Bt) ){.        m
2e840 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2e850 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e860 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52  maxRootPgno==PTR
2e870 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2e880 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
2e890 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
2e8a0 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
2e8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
2e8c0 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
2e8d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2e8e0 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
2e8f0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2e900 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78  teMeta(p, 4, max
2e910 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  RootPgno);.    }
2e920 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e930 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2e940 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2e950 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2e960 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
2e970 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69  {.    /* If sqli
2e980 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2e990 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20  e was called on 
2e9a0 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a  page 1. */.    z
2e9b0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50  eroPage(pPage, P
2e9c0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2e9d0 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  AF );.    releas
2e9e0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e9f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
2ea00 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2ea10 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
2ea20 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2ea30 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
2ea40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2ea50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2ea60 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
2ea70 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61  DropTable(p, iTa
2ea80 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20  ble, piMoved);. 
2ea90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2eaa0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2eab0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2eac0 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f  ad the meta-info
2ead0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61  rmation out of a
2eae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2eaf0 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74   Meta[0].** is t
2eb00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
2eb10 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  e pages currentl
2eb20 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2eb30 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74  e.  Meta[1].** t
2eb40 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20  hrough meta[15] 
2eb50 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  are available fo
2eb60 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20  r use by higher 
2eb70 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d  layers.  Meta[0]
2eb80 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  .** is read-only
2eb90 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65  , the others are
2eba0 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20   read/write..** 
2ebb0 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c  .** The schema l
2ebc0 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74  ayer numbers met
2ebd0 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65  a values differe
2ebe0 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63  ntly.  At the sc
2ebf0 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61  hema.** layer (a
2ec00 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65  nd the SetCookie
2ec10 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20   and ReadCookie 
2ec20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d  opcodes) the num
2ec30 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70  ber of.** free p
2ec40 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69  ages is not visi
2ec50 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b  ble.  So Cookie[
2ec60 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  0] is the same a
2ec70 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e  s Meta[1]..*/.in
2ec80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
2ec90 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  tMeta(Btree *p, 
2eca0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d  int idx, u32 *pM
2ecb0 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  eta){.  DbPage *
2ecc0 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  pDbPage;.  int r
2ecd0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
2ece0 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61  ar *pP1;.  BtSha
2ecf0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2ed00 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
2ed10 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 2f  eeEnter(p);..  /
2ed20 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61  * Reading a meta
2ed30 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75  -data value requ
2ed40 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
2ed50 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20   on page 1 (and 
2ed60 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73  hence.  ** the s
2ed70 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2ed80 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73  le. We grab this
2ed90 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73   lock regardless
2eda0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20   of whether or. 
2edb0 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49   ** not the SQLI
2edc0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2edd0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28  ed flag is set (
2ede0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2edf0 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20   at page.  ** 1 
2ee00 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20  is treated as a 
2ee10 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20  special case by 
2ee20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
2ee30 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29   and lockTable()
2ee40 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71  )..  */.  rc = q
2ee50 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
2ee60 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
2ee70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ee90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2eea0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2eeb0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
2eec0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
2eed0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2eee0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
2eef0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50  pPager, 1, &pDbP
2ef00 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2ef10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
2ef20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
2ef30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2ef40 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
2ef50 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
2ef60 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
2ef70 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d  age);.  *pMeta =
2ef80 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33   get4byte(&pP1[3
2ef90 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73  6 + idx*4]);.  s
2efa0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2efb0 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  (pDbPage);..  /*
2efc0 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64   If autovacuumed
2efd0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
2efe0 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77  this build but w
2eff0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
2f000 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20  .  ** access an 
2f010 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74  autovacuumed dat
2f020 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65  abase, then make
2f030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
2f040 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69  adonly. .  */.#i
2f050 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2f060 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
2f070 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65  ( idx==4 && *pMe
2f080 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64  ta>0 ) pBt->read
2f090 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  Only = 1;.#endif
2f0a0 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
2f0b0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
2f0c0 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c  e 1. */.  rc = l
2f0d0 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52  ockTable(p, 1, R
2f0e0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c  EAD_LOCK);.  sql
2f0f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2f100 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2f110 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
2f120 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2f130 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
2f140 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
2f150 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
2f160 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
2f170 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
2f180 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2f190 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
2f1a0 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
2f1b0 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
2f1c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2f1d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2f1e0 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
2f1f0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
2f200 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2f210 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2f220 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  er(p);.  if( p->
2f230 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2f240 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  RITE ){.    rc =
2f250 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2f260 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2f270 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2f280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2f290 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
2f2a0 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20  1!=0 );.    pP1 
2f2b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  = pBt->pPage1->a
2f2c0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73  Data;.    rc = s
2f2d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f2e0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
2f2f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2f300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f310 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2f320 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2f330 2c 20 69 4d 65 74 61 29 3b 0a 20 20 20 20 20 20  , iMeta);.      
2f340 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20  if( idx==7 ){.  
2f350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2f360 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c  t->autoVacuum ||
2f370 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20   iMeta==0 );.   
2f380 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 65       assert( iMe
2f390 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d  ta==0 || iMeta==
2f3a0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74  1 );.        pBt
2f3b0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69  ->incrVacuum = i
2f3c0 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Meta;.      }.  
2f3d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2f3e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2f3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f400 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2f410 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68   flag byte at th
2f420 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2f430 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65  he page that the
2f440 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75   cursor.** is cu
2f450 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2f460 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
2f470 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74  te3BtreeFlags(Bt
2f480 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2f490 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61   /* TODO: What a
2f4a0 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55  bout CURSOR_REQU
2f4b0 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50  IRESEEK state? P
2f4c0 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20  robably need to 
2f4d0 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72  call.  ** restor
2f4e0 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
2f4f0 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20  sition() here.. 
2f500 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2f510 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f520 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
2f530 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
2f540 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2f550 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
2f560 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65  rn pPage ? pPage
2f570 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2f580 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d  drOffset] : 0;.}
2f590 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2f5a0 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
2f5b0 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65  ated with a BTre
2f5c0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2f5d0 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
2f5e0 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2f5f0 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50  gging only..*/.P
2f600 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72  ager *sqlite3Btr
2f610 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70  eePager(Btree *p
2f620 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
2f630 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
2f640 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  ld(p->pSqlite->m
2f650 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2f660 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  t( sqlite3BtreeM
2f670 75 74 65 78 48 65 6c 64 28 70 2d 3e 70 42 74 2d  utexHeld(p->pBt-
2f680 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
2f690 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  urn p->pBt->pPag
2f6a0 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  er;.}..#ifndef S
2f6b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2f6c0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
2f6d0 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67   Append a messag
2f6e0 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  e to the error m
2f6f0 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a  essage string..*
2f700 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
2f710 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20  eckAppendMsg(.  
2f720 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
2f730 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73  eck,.  char *zMs
2f740 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g1,.  const char
2f750 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e   *zFormat,.  ...
2f760 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2f770 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32 3b  ;.  char *zMsg2;
2f780 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e  .  if( !pCheck->
2f790 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  mxErr ) return;.
2f7a0 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d    pCheck->mxErr-
2f7b0 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72  -;.  pCheck->nEr
2f7c0 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  r++;.  va_start(
2f7d0 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
2f7e0 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56  zMsg2 = sqlite3V
2f7f0 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46 6f 72 6d  MPrintf(0, zForm
2f800 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2f810 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73  d(ap);.  if( zMs
2f820 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20  g1==0 ) zMsg1 = 
2f830 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  "";.  if( pCheck
2f840 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
2f850 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43   char *zOld = pC
2f860 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  heck->zErrMsg;. 
2f870 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d     pCheck->zErrM
2f880 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  sg = 0;.    sqli
2f890 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43  te3SetString(&pC
2f8a0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a  heck->zErrMsg, z
2f8b0 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31  Old, "\n", zMsg1
2f8c0 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29  , zMsg2, (char*)
2f8d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
2f8e0 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65  free(zOld);.  }e
2f8f0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2f900 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63  SetString(&pChec
2f910 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67  k->zErrMsg, zMsg
2f920 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
2f930 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  )0);.  }.  sqlit
2f940 65 33 5f 66 72 65 65 28 7a 4d 73 67 32 29 3b 0a  e3_free(zMsg2);.
2f950 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f960 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2f970 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
2f980 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f990 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
2f9a0 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74  /*.** Add 1 to t
2f9b0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
2f9c0 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67  nt for page iPag
2f9d0 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  e.  If this is t
2f9e0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66  he second.** ref
2f9f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
2fa00 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72  ge, add an error
2fa10 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65   message to pChe
2fa20 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20  ck->zErrMsg..** 
2fa30 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
2fa40 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65  e are 2 ore more
2fa50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2fa60 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66  he page and 0 if
2fa70 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
2fa80 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e  he first referen
2fa90 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a  ce to the page..
2faa0 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b  **.** Also check
2fab0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2fac0 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e  umber is in boun
2fad0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
2fae0 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67  t checkRef(Integ
2faf0 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
2fb00 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20  int iPage, char 
2fb10 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66  *zContext){.  if
2fb20 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
2fb30 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61  urn 1;.  if( iPa
2fb40 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65  ge>pCheck->nPage
2fb50 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20   || iPage<0 ){. 
2fb60 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2fb70 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2fb80 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67  xt, "invalid pag
2fb90 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50  e number %d", iP
2fba0 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2fbb0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   1;.  }.  if( pC
2fbc0 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
2fbd0 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65  e]==1 ){.    che
2fbe0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2fbf0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32  ck, zContext, "2
2fc00 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
2fc10 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
2fc20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
2fc30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70    }.  return  (p
2fc40 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
2fc50 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66  ge]++)>1;.}..#if
2fc60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fc70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
2fc80 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2fc90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2fca0 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61  inter-map for pa
2fcb0 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74  ge iChild maps t
2fcc0 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65  o .** page iPare
2fcd0 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65  nt, pointer type
2fce0 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74   ptrType. If not
2fcf0 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f  , append an erro
2fd00 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20  r message.** to 
2fd10 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  pCheck..*/.stati
2fd20 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d  c void checkPtrm
2fd30 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ap(.  IntegrityC
2fd40 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20  k *pCheck,   /* 
2fd50 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  Integrity check 
2fd60 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e  context */.  Pgn
2fd70 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20  o iChild,       
2fd80 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67      /* Child pag
2fd90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38  e number */.  u8
2fda0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
2fdb0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
2fdc0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70   pointer map typ
2fdd0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72  e */.  Pgno iPar
2fde0 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ent,          /*
2fdf0 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
2fe00 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67  r map parent pag
2fe10 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
2fe20 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
2fe30 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
2fe40 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65  description (use
2fe50 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29  d for error msg)
2fe60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2fe70 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70  .  u8 ePtrmapTyp
2fe80 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  e;.  Pgno iPtrma
2fe90 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d  pParent;..  rc =
2fea0 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63   ptrmapGet(pChec
2feb0 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20  k->pBt, iChild, 
2fec0 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69  &ePtrmapType, &i
2fed0 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
2fee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fef0 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  OK ){.    checkA
2ff00 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2ff10 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c   zContext, "Fail
2ff20 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61  ed to read ptrma
2ff30 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c  p key=%d", iChil
2ff40 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  d);.    return;.
2ff50 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d    }..  if( ePtrm
2ff60 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c  apType!=eType ||
2ff70 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d   iPtrmapParent!=
2ff80 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63  iParent ){.    c
2ff90 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2ffa0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2ffb0 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20  .      "Bad ptr 
2ffc0 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64  map entry key=%d
2ffd0 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64   expected=(%d,%d
2ffe0 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20  ) got=(%d,%d)", 
2fff0 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65  .      iChild, e
30000 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65  Type, iParent, e
30010 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72  PtrmapType, iPtr
30020 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  mapParent);.  }.
30030 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
30040 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
30050 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c  ity of the freel
30060 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65  ist or of an ove
30070 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e  rflow page list.
30080 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
30090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
300a0 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ges on the list 
300b0 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  is N..*/.static 
300c0 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a  void checkList(.
300d0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
300e0 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67  Check,  /* Integ
300f0 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f  rity checking co
30100 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
30110 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20  sFreeList,      
30120 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66   /* True for a f
30130 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20  reelist.  False 
30140 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  for overflow pag
30150 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
30160 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
30170 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
30180 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20   for first page 
30190 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
301a0 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
301b0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
301c0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ed number of pag
301d0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  es in the list *
301e0 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
301f0 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  xt        /* Con
30200 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
30210 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  essages */.){.  
30220 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70  int i;.  int exp
30230 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74  ected = N;.  int
30240 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b   iFirst = iPage;
30250 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
30260 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  0 && pCheck->mxE
30270 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65  rr ){.    DbPage
30280 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20   *pOvflPage;.   
30290 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
302a0 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69  pOvflData;.    i
302b0 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20  f( iPage<1 ){.  
302c0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
302d0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
302e0 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25  ext,.         "%
302f0 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69  d of %d pages mi
30300 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66  ssing from overf
30310 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e  low list startin
30320 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20  g at %d",.      
30330 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65      N+1, expecte
30340 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  d, iFirst);.    
30350 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
30360 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28     if( checkRef(
30370 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
30380 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b  Context) ) break
30390 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
303a0 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b  3PagerGet(pCheck
303b0 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29  ->pPager, (Pgno)
303c0 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67  iPage, &pOvflPag
303d0 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  e) ){.      chec
303e0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
303f0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
30400 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
30410 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
30420 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
30430 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d  .    pOvflData =
30440 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
30450 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
30460 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29  tData(pOvflPage)
30470 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65  ;.    if( isFree
30480 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
30490 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  t n = get4byte(&
304a0 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23  pOvflData[4]);.#
304b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
304c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
304d0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
304e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
304f0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
30500 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
30510 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
30520 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
30530 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
30540 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  dif.      if( n>
30550 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61  pCheck->pBt->usa
30560 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20  bleSize/4-8 ){. 
30570 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
30580 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
30590 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
305a0 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61     "freelist lea
305b0 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20  f count too big 
305c0 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  on page %d", iPa
305d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d  ge);.        N--
305e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
305f0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
30600 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
30610 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
30620 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
30630 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d  pOvflData[8+i*4]
30640 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30650 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30660 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  M.          if( 
30670 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
30680 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30690 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
306a0 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ap(pCheck, iFree
306b0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
306c0 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
306d0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xt);.          }
306e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
306f0 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63    checkRef(pChec
30700 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43  k, iFreePage, zC
30710 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
30720 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20   }.        N -= 
30730 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
30740 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30750 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30760 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
30770 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
30780 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
30790 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61  o-vacuum and iPa
307a0 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  ge is not the la
307b0 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  st.      ** page
307c0 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   in this overflo
307d0 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68  w list, check th
307e0 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  at the pointer-m
307f0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  ap entry for.   
30800 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
30810 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73  ing page matches
30820 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f   iPage..      */
30830 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
30840 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
30850 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20  um && N>0 ){.   
30860 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74       i = get4byt
30870 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
30880 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
30890 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52  p(pCheck, i, PTR
308a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
308b0 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
308c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
308d0 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20  endif.    iPage 
308e0 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
308f0 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
30900 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
30910 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23  flPage);.  }.}.#
30920 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
30930 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
30940 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
30950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
30960 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
30970 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
30980 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
30990 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
309a0 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
309b0 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
309c0 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
309d0 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
309e0 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
309f0 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
30a00 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
30a10 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
30a20 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
30a30 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
30a40 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
30a50 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
30a60 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
30a70 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
30a80 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
30a90 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
30aa0 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b  .**  NO  2.  Mak
30ab0 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
30ac0 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
30ad0 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20  *  NO  3.  Make 
30ae0 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
30af0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
30b00 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
30b10 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61  ..**  NO  4.  Ma
30b20 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
30b30 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
30b40 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
30b50 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
30b60 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
30b70 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
30b80 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
30b90 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
30ba0 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
30bb0 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
30bc0 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
30bd0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
30be0 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
30bf0 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
30c00 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
30c10 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
30c20 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
30c30 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
30c40 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
30c50 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
30c60 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
30c70 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
30c80 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
30c90 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
30ca0 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
30cb0 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
30cc0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
30cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
30ce0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
30cf0 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
30d00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
30d10 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
30d20 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
30d30 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
30d40 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
30d50 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
30d60 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
30d70 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
30d80 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
30d90 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
30da0 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
30db0 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
30dc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
30dd0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
30de0 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
30df0 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
30e00 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *hit;..  sqlite3
30e10 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30e20 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
30e30 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
30e40 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
30e50 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
30e60 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
30e70 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
30e80 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
30e90 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
30ea0 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
30eb0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
30ec0 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
30ed0 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
30ee0 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
30ef0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
30f00 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
30f10 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
30f20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50  (Pgno)iPage, &pP
30f30 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  age, 0))!=0 ){. 
30f40 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
30f50 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
30f60 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62  xt,.       "unab
30f70 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  le to get the pa
30f80 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  ge. error code=%
30f90 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74  d", rc);.    ret
30fa0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
30fb0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
30fc0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
30fd0 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
30fe0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
30ff0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
31000 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
31010 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
31020 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
31030 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
31040 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
31050 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
31060 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
31070 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
31080 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
31090 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
310a0 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
310b0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
310c0 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
310d0 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
310e0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
310f0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
31100 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
31110 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
31120 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
31130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
31140 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31150 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
31160 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
31170 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70        "On tree p
31180 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
31190 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
311a0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
311b0 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
311c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
311d0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
311e0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
311f0 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
31200 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
31210 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
31220 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
31230 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69     assert( sz==i
31240 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
31250 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e      if( sz>info.
31260 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
31270 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20  int nPage = (sz 
31280 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
31290 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f  usableSize - 5)/
312a0 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  (usableSize - 4)
312b0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
312c0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
312d0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
312e0 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65  erflow]);.#ifnde
312f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31300 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
31310 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31320 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
31330 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31340 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
31350 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50  AP_OVERFLOW1, iP
31360 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31370 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31380 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70       checkList(p
31390 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76  Check, 0, pgnoOv
313a0 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74  fl, nPage, zCont
313b0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
313c0 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79   /* Check sanity
313d0 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70   of left child p
313e0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
313f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31400 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d   ){.      pgno =
31410 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
31420 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31430 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31440 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
31450 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31460 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
31470 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
31480 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
31490 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
314a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
314b0 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54       d2 = checkT
314c0 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70  reePage(pCheck,p
314d0 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65  gno,pPage,zConte
314e0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  xt);.      if( i
314f0 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20  >0 && d2!=depth 
31500 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31510 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31520 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69  , zContext, "Chi
31530 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69  ld page depth di
31540 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d  ffers");.      }
31550 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64  .      depth = d
31560 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
31570 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31580 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
31590 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
315a0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
315b0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73  ffset+8]);.    s
315c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
315d0 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
315e0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31600 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74    "On page %d at
31610 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c   right child: ",
31620 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
31630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31640 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
31650 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31660 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74  ){.      checkPt
31670 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
31680 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
31690 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20   iPage, 0);.    
316a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
316b0 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
316c0 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20  k, pgno, pPage, 
316d0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  zContext);.  }. 
316e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
316f0 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67  complete coverag
31700 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20  e of the page.  
31710 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  */.  data = pPag
31720 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
31730 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
31740 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69  et;.  hit = sqli
31750 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 75  te3MallocZero( u
31760 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
31770 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65  f( hit ){.    me
31780 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74  mset(hit, 1, get
31790 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
317a0 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  5]));.    nCell 
317b0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
317c0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65  [hdr+3]);.    ce
317d0 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20  llStart = hdr + 
317e0 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
317f0 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  af;.    for(i=0;
31800 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
31810 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67        int pc = g
31820 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
31830 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20  llStart+i*2]);. 
31840 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
31850 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
31860 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
31870 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
31880 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31    if( (pc+size-1
31890 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
318a0 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   pc<0 ){.       
318b0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
318c0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
318d0 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
318e0 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
318f0 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
31900 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
31910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31920 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69       for(j=pc+si
31930 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d  ze-1; j>=pc; j--
31940 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
31950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
31960 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62  r(cnt=0, i=get2b
31970 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
31980 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62  ); i>0 && i<usab
31990 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30  leSize && cnt<10
319a0 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20  000; .          
319b0 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69   cnt++){.      i
319c0 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
319d0 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a  te(&data[i+2]);.
319e0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
319f0 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31     if( (i+size-1
31a00 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
31a10 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
31a20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31a30 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20  Check, 0,  .    
31a40 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
31a50 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
31a60 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
31a70 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
31a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31a90 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a       for(j=i+siz
31aa0 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  e-1; j>=i; j--) 
31ab0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
31ac0 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32  }.      i = get2
31ad0 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a  byte(&data[i]);.
31ae0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
31af0 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53  cnt=0; i<usableS
31b00 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ize; i++){.     
31b10 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29   if( hit[i]==0 )
31b20 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
31b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
31b40 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
31b50 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31b60 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20  Msg(pCheck, 0,. 
31b70 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70           "Multip
31b80 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65  le uses for byte
31b90 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
31ba0 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20   i, iPage);.    
31bb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31bc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31bd0 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37   cnt!=data[hdr+7
31be0 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ] ){.      check
31bf0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31c00 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
31c10 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63  "Fragmented spac
31c20 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70  e is %d byte rep
31c30 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70  orted as %d on p
31c40 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20  age %d",.       
31c50 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72     cnt, data[hdr
31c60 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  +7], iPage);.   
31c70 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
31c80 5f 66 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72  _free(hit);..  r
31c90 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
31ca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74  );.  return dept
31cb0 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  h+1;.}.#endif /*
31cc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
31cd0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
31ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31cf0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
31d00 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  HECK./*.** This 
31d10 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
31d20 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66  omplete check of
31d30 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65 65   the given BTree
31d40 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20   file.  aRoot[] 
31d50 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  is.** an array o
31d60 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  f pages numbers 
31d70 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20 6e  were each page n
31d80 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f  umber is the roo
31d90 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74  t page of.** a t
31da0 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20  able.  nRoot is 
31db0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
31dc0 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a  tries in aRoot..
31dd0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
31de0 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20  ing checks out, 
31df0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
31e00 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73  urns NULL.  If s
31e10 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61  omething is.** a
31e20 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d  miss, an error m
31e30 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
31e40 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
31e50 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
31e60 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f  oc().** and a po
31e70 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65 72  inter to that er
31e80 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 72  ror message is r
31e90 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61  eturned.  The ca
31ea0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
31eb0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
31ec0 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
31ed0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
31ee0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
31ef0 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
31f00 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68  BtreeIntegrityCh
31f10 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  eck(.  Btree *p,
31f20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
31f30 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20  e to be checked 
31f40 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c  */.  int *aRoot,
31f50 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f     /* An array o
31f60 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  f root pages num
31f70 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64  bers for individ
31f80 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69  ual trees */.  i
31f90 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20  nt nRoot,    /* 
31fa0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
31fb0 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a  s in aRoot[] */.
31fc0 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20    int mxErr,    
31fd0 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e  /* Stop reportin
31fe0 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20 74  g errors after t
31ff0 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e  his many */.  in
32000 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57  t *pnErr    /* W
32010 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  rite number of e
32020 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68  rrors seen to th
32030 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29  is variable */.)
32040 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
32050 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69   nRef;.  Integri
32060 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42  tyCk sCheck;.  B
32070 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32080 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
32090 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
320a0 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33    nRef = sqlite3
320b0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
320c0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
320d0 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  ( lockBtreeWithR
320e0 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f  etry(p)!=SQLITE_
320f0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
32100 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
32110 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
32120 65 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65  e3StrDup("Unable
32130 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65   to acquire a re
32140 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
32150 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
32160 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
32170 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
32180 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
32190 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
321a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
321b0 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e  agecount(sCheck.
321c0 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63  pPager);.  sChec
321d0 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b  k.mxErr = mxErr;
321e0 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d  .  sCheck.nErr =
321f0 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30   0;.  *pnErr = 0
32200 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32210 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32220 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75  .  if( pBt->nTru
32230 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68  nc!=0 ){.    sCh
32240 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d  eck.nPage = pBt-
32250 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e  >nTrunc;.  }.#en
32260 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b  dif.  if( sCheck
32270 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  .nPage==0 ){.   
32280 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
32290 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
322a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
322b0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
322c0 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  0;.  }.  sCheck.
322d0 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 5f  anRef = sqlite3_
322e0 6d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e  malloc( (sCheck.
322f0 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
32300 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
32310 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63   );.  if( !sChec
32320 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75  k.anRef ){.    u
32330 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
32340 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e  ed(pBt);.    *pn
32350 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Err = 1;.    sql
32360 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
32370 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
32380 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 2d 3e  lite3MPrintf(p->
32390 70 53 71 6c 69 74 65 2c 20 22 55 6e 61 62 6c 65  pSqlite, "Unable
323a0 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79   to malloc %d by
323b0 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28  tes", .        (
323c0 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
323d0 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
323e0 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Ref[0]));.  }.  
323f0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
32400 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
32410 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
32420 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
32430 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32440 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
32450 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
32460 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
32470 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68  ] = 1;.  }.  sCh
32480 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  eck.zErrMsg = 0;
32490 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
324a0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
324b0 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a  e freelist.  */.
324c0 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68    checkList(&sCh
324d0 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65  eck, 1, get4byte
324e0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
324f0 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20  Data[32]),.     
32500 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
32510 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
32520 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20  ata[36]), "Main 
32530 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20  freelist: ");.. 
32540 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68   /* Check all th
32550 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
32560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f   for(i=0; i<nRoo
32570 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72  t && sCheck.mxEr
32580 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
32590 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63   aRoot[i]==0 ) c
325a0 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
325b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
325c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
325d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
325e0 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b  && aRoot[i]>1 ){
325f0 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
32600 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ap(&sCheck, aRoo
32610 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  t[i], PTRMAP_ROO
32620 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20  TPAGE, 0, 0);.  
32630 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
32640 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43  heckTreePage(&sC
32650 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
32660 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65  0, "List of tree
32670 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a   roots: ");.  }.
32680 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
32690 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
326a0 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65  e file is refere
326b0 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nced.  */.  for(
326c0 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=1; i<=sCheck.n
326d0 50 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d  Page && sCheck.m
326e0 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64  xErr; i++){.#ifd
326f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32700 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
32710 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
32720 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  ]==0 ){.      ch
32730 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
32740 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
32750 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
32760 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  , i);.    }.#els
32770 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  e.    /* If the 
32780 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
32790 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d  s auto-vacuum, m
327a0 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c  ake sure no tabl
327b0 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  es contain.    *
327c0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
327d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
327e0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
327f0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
32800 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]==0 && .       
32810 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
32820 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42  Bt, i)!=i || !pB
32830 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
32840 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32850 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
32860 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
32870 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
32880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43      }.    if( sC
32890 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30  heck.anRef[i]!=0
328a0 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
328b0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
328c0 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75  i)==i && pBt->au
328d0 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
328e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
328f0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
32900 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
32910 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  %d is referenced
32920 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ", i);.    }.#en
32930 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  dif.  }..  /* Ma
32940 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61  ke sure this ana
32950 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65  lysis did not le
32960 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20  ave any unref() 
32970 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c  pages.  */.  unl
32980 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
32990 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65  (pBt);.  if( nRe
329a0 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65  f != sqlite3Page
329b0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
329c0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68  Pager) ){.    ch
329d0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
329e0 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
329f0 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67  "Outstanding pag
32a00 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f  e count goes fro
32a10 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e  m %d to %d durin
32a20 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22  g this analysis"
32a30 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71  ,.      nRef, sq
32a40 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
32a50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a  nt(pBt->pPager).
32a60 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a      );.  }..  /*
32a70 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72   Clean  up and r
32a80 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20  eport errors..  
32a90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
32aa0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c  eLeave(p);.  sql
32ab0 69 74 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b  ite3_free(sCheck
32ac0 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72  .anRef);.  *pnEr
32ad0 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b  r = sCheck.nErr;
32ae0 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b  .  return sCheck
32af0 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64  .zErrMsg;.}.#end
32b00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
32b10 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32b20 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
32b30 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
32b40 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
32b50 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
32b60 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
32b70 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
32b80 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
32b90 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
32ba0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
32bb0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
32bc0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
32bd0 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
32be0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
32bf0 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
32c00 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
32c10 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
32c20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
32c30 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
32c40 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
32c50 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65  GetDirname(Btree
32c60 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
32c70 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
32c80 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
32c90 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
32ca0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
32cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
32cc0 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
32cd0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
32ce0 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74  ile for this dat
32cf0 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72  abase. The retur
32d00 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  n.** value of th
32d10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
32d20 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73  e same regardles
32d30 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
32d40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
32d50 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
32d60 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e  d or not..*/.con
32d70 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
32d80 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
32d90 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
32da0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
32db0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
32dc0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
32dd0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
32de0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
32df0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
32e00 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
32e10 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
32e20 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
32e30 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
32e40 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
32e50 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
32e60 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
32e70 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
32e80 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74  size of file pBt
32e90 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75  From may be redu
32ea0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
32eb0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
32ec0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
32ed0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
32ee0 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20  n on pBtFrom is 
32ef0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
32f00 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
32f10 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
32f20 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
32f30 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
32f40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
32f50 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61   i, nPage, nToPa
32f60 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74  ge, iSkip;..  Bt
32f70 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
32f80 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
32f90 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
32fa0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69  pFrom->pBt;..  i
32fb0 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21  f( pTo->inTrans!
32fc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
32fd0 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d  pFrom->inTrans!=
32fe0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
32ff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33000 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
33010 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72  ( pBtTo->pCursor
33020 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
33030 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65  _BUSY;.  nToPage
33040 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
33050 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
33060 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65  pPager);.  nPage
33070 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
33080 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
33090 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
330a0 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
330b0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20  E_PAGE(pBtTo);. 
330c0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
330d0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
330e0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
330f0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
33100 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
33110 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
33120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33130 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
33140 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
33150 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
33160 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
33170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  = sqlite3PagerOv
33180 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70  erwrite(pBtTo->p
33190 50 61 67 65 72 2c 20 69 2c 20 73 71 6c 69 74 65  Pager, i, sqlite
331a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
331b0 62 50 61 67 65 29 29 3b 0a 20 20 20 20 73 71 6c  bPage));.    sql
331c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
331d0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  DbPage);.  }..  
331e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
331f0 73 20 73 68 72 69 6e 6b 69 6e 67 2c 20 6a 6f 75  s shrinking, jou
33200 72 6e 61 6c 20 74 68 65 20 70 61 67 65 73 20 74  rnal the pages t
33210 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 74 72  hat are being tr
33220 75 6e 63 61 74 65 64 0a 20 20 2a 2a 20 73 6f 20  uncated.  ** so 
33230 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
33240 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20   rolled back if 
33250 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
33260 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
33270 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49  Page+1; rc==SQLI
33280 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50  TE_OK && i<=nToP
33290 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
332a0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
332b0 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
332c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
332d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
332e0 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
332f0 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65  ger, i, &pDbPage
33300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33310 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
33320 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33330 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
33340 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
33350 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
33360 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74      /* Yeah.  It
33370 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20   seems wierd to 
33380 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29  call DontWrite()
33390 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69   right after Wri
333a0 74 65 28 29 2e 20 20 42 75 74 0a 20 20 20 20 2a  te().  But.    *
333b0 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
333c0 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
333d0 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
333e0 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
333f0 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
33400 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20   what they do.  
33410 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d  Write() really m
33420 65 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70  eans "put this p
33430 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  age in the.    *
33440 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
33450 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61  al and mark it a
33460 73 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20  s dirty so that 
33470 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  it will be writt
33480 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  en.    ** to the
33490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
334a0 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
334b0 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
334c0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
334d0 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72    ** that and pr
334e0 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20  events the page 
334f0 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74  from being writt
33500 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
33510 73 65 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  se.  The.    ** 
33520 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e  page is still on
33530 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
33540 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20  urnal, though.  
33550 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20  And that is the 
33560 77 68 6f 6c 65 0a 20 20 20 20 2a 2a 20 70 6f 69  whole.    ** poi
33570 6e 74 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 3a  nt of this loop:
33580 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e   to put pages on
33590 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
335a0 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 73 71  urnal. */.    sq
335b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
335c0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
335d0 69 66 28 20 21 72 63 20 26 26 20 6e 50 61 67 65  if( !rc && nPage
335e0 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20  <nToPage ){.    
335f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33600 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  rTruncate(pBtTo-
33610 3e 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  >pPager, nPage);
33620 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29  .  }..  if( rc )
33630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
33640 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b  eeRollback(pTo);
33650 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33660 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
33670 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42  3BtreeCopyFile(B
33680 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
33690 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
336a0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
336b0 65 65 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20  eeEnter(pTo);.  
336c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
336d0 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d  r(pFrom);.  rc =
336e0 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70   btreeCopyFile(p
336f0 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71  To, pFrom);.  sq
33700 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
33710 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65  pFrom);.  sqlite
33720 33 42 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29  3BtreeLeave(pTo)
33730 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33740 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
33750 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a  TE_OMIT_VACUUM *
33760 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
33770 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72  non-zero if a tr
33780 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
33790 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
337a0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
337b0 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  s(Btree *p){.  a
337c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
337d0 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 2d 3e  reeMutexHeld(p->
337e0 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
337f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
33800 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
33810 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
33820 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
33830 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
33840 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
33850 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
33860 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33870 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
33880 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
33890 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48  lite3BtreeMutexH
338a0 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
338b0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
338c0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
338d0 78 48 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  xHeld(p->pSqlite
338e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
338f0 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20  turn (p->pBt && 
33900 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b  p->pBt->inStmt);
33910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33920 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72   non-zero if a r
33930 65 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74  ead (or write) t
33940 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
33950 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
33960 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
33970 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  dTrans(Btree *p)
33980 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
33990 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65 6c  te3BtreeMutexHel
339a0 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  d(p->pSqlite->mu
339b0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
339c0 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
339d0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
339e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
339f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
33a00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
33a10 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
33a20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
33a30 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65  * a single share
33a40 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d  d-btree. The mem
33a50 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63  ory is used by c
33a60 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69  lient code for i
33a70 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f  t's own.** purpo
33a80 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ses (for example
33a90 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67  , to store a hig
33aa0 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61  h-level schema a
33ab0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
33ac0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ** the shared-bt
33ad0 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20  ree). The btree 
33ae0 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65  layer manages re
33af0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67  ference counting
33b00 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   issues..**.** T
33b10 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
33b20 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  is is called on 
33b30 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20  a shared-btree, 
33b40 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20  nBytes bytes of 
33b50 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c  memory.** are al
33b60 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c  located, zeroed,
33b70 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f   and returned to
33b80 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72   the caller. For
33b90 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
33ba0 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42   .** call the nB
33bb0 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
33bc0 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20  s ignored and a 
33bd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
33be0 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d  ame blob.** of m
33bf0 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20  emory returned. 
33c00 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f  .**.** Just befo
33c10 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  re the shared-bt
33c20 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ree is closed, t
33c30 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73  he function pass
33c40 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46  ed as the .** xF
33c50 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65  ree argument whe
33c60 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  n the memory all
33c70 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65  ocation was made
33c80 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74   is invoked on t
33c90 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  he .** blob of a
33ca0 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
33cb0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
33cc0 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73  hould not call s
33cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a  qlite3_free().**
33ce0 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   on the memory, 
33cf0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
33d00 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  does that..*/.vo
33d10 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
33d20 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c  Schema(Btree *p,
33d30 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69   int nBytes, voi
33d40 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a  d(*xFree)(void *
33d50 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  )){.  BtShared *
33d60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
33d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
33d80 74 72 65 65 4d 75 74 65 78 48 65 6c 64 28 70 2d  treeMutexHeld(p-
33d90 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
33da0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
33db0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
33dc0 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  ( !pBt->pSchema 
33dd0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68  ){.    pBt->pSch
33de0 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ema = sqlite3Mal
33df0 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b  locZero(nBytes);
33e00 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
33e10 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20  chema = xFree;. 
33e20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
33e30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
33e40 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  urn pBt->pSchema
33e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33e60 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65  n true if anothe
33e70 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 61  r user of the sa
33e80 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  me shared btree 
33e90 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  as the argument.
33ea0 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  ** handle holds 
33eb0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
33ec0 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  k on the sqlite_
33ed0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f  master table..*/
33ee0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33ef0 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74  eSchemaLocked(Bt
33f00 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
33f10 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
33f20 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 48 65  ite3BtreeMutexHe
33f30 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  ld(p->pSqlite->m
33f40 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
33f50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
33f60 0a 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61  .  rc = (queryTa
33f70 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
33f80 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
33f90 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  K)!=SQLITE_OK);.
33fa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
33fb0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
33fc0 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   rc;.}...#ifndef
33fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
33fe0 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
33ff0 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
34000 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65   the table whose
34010 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54   root page is iT
34020 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b  ab.  The.** lock
34030 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   is a write lock
34040 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20   if isWritelock 
34050 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61  is true or a rea
34060 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20  d lock.** if it 
34070 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  is false..*/.int
34080 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63   sqlite3BtreeLoc
34090 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  kTable(Btree *p,
340a0 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73   int iTab, u8 is
340b0 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  WriteLock){.  in
340c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
340d0 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20  ;.  u8 lockType 
340e0 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57  = (isWriteLock?W
340f0 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c  RITE_LOCK:READ_L
34100 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OCK);.  sqlite3B
34110 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
34120 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
34130 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ock(p, iTab, loc
34140 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63  kType);.  if( rc
34150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34160 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c     rc = lockTabl
34170 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54  e(p, iTab, lockT
34180 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
34190 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
341a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
341b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
341c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
341d0 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75  RBLOB./*.** Argu
341e0 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62  ment pCsr must b
341f0 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  e a cursor opene
34200 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e  d for writing on
34210 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74   an .** INTKEY t
34220 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70  able currently p
34230 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
34240 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  id table entry. 
34250 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
34260 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64  n modifies the d
34270 61 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61  ata stored as pa
34280 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79  rt of that entry
34290 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61  ..** Only the da
342a0 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f  ta content may o
342b0 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  nly be modified,
342c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
342d0 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65  ble.** to change
342e0 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
342f0 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a  he data stored..
34300 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
34310 72 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72  reePutData(BtCur
34320 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f  sor *pCsr, u32 o
34330 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
34340 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65  void *z){.  asse
34350 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
34360 4d 75 74 65 78 48 65 6c 64 28 70 43 73 72 2d 3e  MutexHeld(pCsr->
34370 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74  pBtree->pBt->mut
34380 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
34390 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
343a0 65 78 48 65 6c 64 28 70 43 73 72 2d 3e 70 42 74  exHeld(pCsr->pBt
343b0 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  ree->pSqlite->mu
343c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
343d0 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f  (pCsr->isIncrblo
343e0 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66 28 20  bHandle);.  if( 
343f0 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCsr->eState==CU
34400 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
34410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
34420 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
34430 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d  ..  /* Check som
34440 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  e preconditions:
34450 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65   .  **   (a) the
34460 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
34470 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a  for writing,.  *
34480 2a 20 20 20 28 62 29 20 74 68 65 72 65 20 69 73  *   (b) there is
34490 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   no read-lock on
344a0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
344b0 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20   modified and.  
344c0 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63 75 72  **   (c) the cur
344d0 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  sor points at a 
344e0 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20  valid row of an 
344f0 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20  intKey table..  
34500 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e  */.  if( !pCsr->
34510 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
34520 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
34530 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ONLY;.  }.  asse
34540 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74 72 65  rt( !pCsr->pBtre
34550 65 2d 3e 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  e->pBt->readOnly
34560 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70   .          && p
34570 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Csr->pBtree->pBt
34580 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
34590 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
345a0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
345b0 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65  ocks(pCsr->pBtre
345c0 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCsr->pgnoRoo
345d0 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20  t, pCsr) ){.    
345e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
345f0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
34600 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
34610 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
34620 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
34630 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
34640 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21  SOR_INVALID || !
34650 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCsr->pPage->int
34660 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
34670 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
34680 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63    }..  return ac
34690 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72  cessPayload(pCsr
346a0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
346b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
346c0 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20  z, 0, 1);.}../* 
346d0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f  .** Set a flag o
346e0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f  n this cursor to
346f0 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74   cache the locat
34700 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72  ions of pages fr
34710 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66  om the .** overf
34720 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65  low list for the
34730 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68   current row. Th
34740 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63 75  is is used by cu
34750 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
34760 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  for incremental 
34770 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a  blob IO only..**
34780 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
34790 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e  n sets a flag on
347a0 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ly. The actual p
347b0 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63  age location cac
347c0 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e  he.** (stored in
347d0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
347e0 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61  low[]) is alloca
347f0 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79 20  ted and used by 
34800 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
34810 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65  ssPayload() (the
34820 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   worker function
34830 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   for sqlite3Btre
34840 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73  eData() and.** s
34850 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
34860 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ta())..*/.void s
34870 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68 65  qlite3BtreeCache
34880 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f  Overflow(BtCurso
34890 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
348a0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
348b0 4d 75 74 65 78 48 65 6c 64 28 70 43 75 72 2d 3e  MutexHeld(pCur->
348c0 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 6d 75 74  pBtree->pBt->mut
348d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
348e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
348f0 65 78 48 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  exHeld(pCur->pBt
34900 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  ree->pSqlite->mu
34910 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
34920 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  (!pCur->isIncrbl
34930 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73  obHandle);.  ass
34940 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
34950 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69  flow);.  pCur->i
34960 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
34970 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a        = 1;.}.#endif.