/ Hex Artifact Content
Login

Artifact 9d684690afbc66f20905c408e2e018008cf99277:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 32 34 20 32 30 30 37 2f 30  c,v 1.424 2007/0
0190: 39 2f 30 36 20 32 33 3a 33 39 3a 33 37 20 64 72  9/06 23:39:37 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
03a0: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
03b0: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
03c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69   */.#endif....#i
03d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
03e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
03f0: 2a 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69  *.** A flag to i
0400: 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20  ndicate whether 
0410: 6f 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61  or not shared ca
0420: 63 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  che is enabled. 
0430: 20 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74   Also,.** a list
0440: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0450: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0460: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0470: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0480: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0490: 65 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65  e variables have
04a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
04b0: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
04c0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04d0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20  to access these 
04f0: 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20  variables so we 
0500: 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f  make them.** glo
0510: 62 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69  bal for test bui
0520: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  lds..*/.#ifdef S
0530: 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61  QLITE_TEST.BtSha
0540: 72 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72  red *sqlite3Shar
0550: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
0560: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72  .int sqlite3Shar
0570: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0580: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
0590: 20 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74   BtShared *sqlit
05a0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05b0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  t = 0;.static in
05c0: 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  t sqlite3SharedC
05d0: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b  acheEnabled = 0;
05e0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
05f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
0600: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
0610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0620: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0630: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
0640: 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72  disable the shar
0650: 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68  ed pager and sch
0660: 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a  ema features..**
0670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0680: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f   has no effect o
0690: 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
06a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
06b0: 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63  .** The shared c
06c0: 61 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66  ache setting eff
06d0: 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65  ects only future
06e0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
06f0: 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c  ite3_open(), sql
0700: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f  ite3_open16(), o
0710: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
0720: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
0730: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0740: 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62  d_cache(int enab
0750: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68  le){.  sqlite3Sh
0760: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
0770: 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74   = enable;.  ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
0790: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
07a0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
07b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
07c0: 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
07d0: 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43  (Btree*,Pgno,BtC
07e0: 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65  ursor*);...#ifde
07f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0800: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
0810: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0820: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0830: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0840: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0850: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09c0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09d0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09e0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09f0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0a00: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
0a10: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a40: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a50: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a60: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a70: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a80: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a90: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0aa0: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0ab0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0ac0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ad0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ae0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0af0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0b00: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0b10: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b20: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b40: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b50: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b60: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b80: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b90: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0ba0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
0bb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
0bc0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
0bd0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61  no-op if the sha
0be0: 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74  red-cache is not
0bf0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
0c00: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  ( !p->sharable )
0c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0c20: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
0c30: 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69  * This (along wi
0c40: 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20  th lockTable()) 
0c50: 69 73 20 77 68 65 72 65 20 74 68 65 20 52 65 61  is where the Rea
0c60: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0c70: 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20  g is.  ** dealt 
0c80: 77 69 74 68 2e 20 49 66 20 74 68 65 20 63 61 6c  with. If the cal
0c90: 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20  ler is querying 
0ca0: 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  for a read-lock 
0cb0: 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73 0a  and the flag is.
0cc0: 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73 20    ** set, it is 
0cd0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20  unconditionally 
0ce0: 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20 69  granted - even i
0cf0: 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69 74  f there are writ
0d00: 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20  e-locks.  ** on 
0d10: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61 20  the table. If a 
0d20: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65  write-lock is re
0d30: 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65 61  quested, the Rea
0d40: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0d50: 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  g.  ** is not co
0d60: 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20  nsidered..  **. 
0d70: 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20   ** In function 
0d80: 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66 20  lockTable(), if 
0d90: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64  a read-lock is d
0da0: 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20  emanded and the 
0db0: 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d  .  ** ReadUncomm
0dc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0dd0: 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61  t, no entry is a
0de0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b  dded to the lock
0df0: 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74  s list .  ** (Bt
0e00: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20  Shared.pLock).. 
0e10: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d   **.  ** To summ
0e20: 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65  arize: If the Re
0e30: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0e40: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
0e50: 72 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f 0a  read cursors do.
0e60: 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65 20    ** not create 
0e70: 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65  or respect table
0e80: 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b   locks. The lock
0e90: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ing procedure fo
0ea0: 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d  r a .  ** write-
0eb0: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
0ec0: 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
0ed0: 66 28 20 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c  f( .    !p->pSql
0ee0: 69 74 65 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28  ite || .    0==(
0ef0: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67  p->pSqlite->flag
0f00: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0f10: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0f20: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0f30: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0f40: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
0f50: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
0f60: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
0f70: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
0f80: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
0f90: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
0fa0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
0fb0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
0fc0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
0fd0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
0fe0: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
0ff0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
1000: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1010: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
1020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1030: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1040: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1050: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1060: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1070: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1080: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
1090: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
10a0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
10b0: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
10c0: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
10d0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
10e0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
10f0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
1100: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
1110: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
1120: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
1130: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1140: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
1150: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
1160: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
1170: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
1180: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
1190: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
11a0: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
11b0: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
11c0: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
11d0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11e0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
11f0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
1200: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1210: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1220: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1230: 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20  tex(p) );..  /* 
1240: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1250: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1260: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1270: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1280: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
12c0: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
12d0: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
12e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
12f0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1300: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
1310: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
1320: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
1330: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
1340: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1350: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1360: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1370: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1380: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
1390: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
13a0: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
13b0: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
13c0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
13d0: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
13e0: 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74   .    (p->pSqlit
13f0: 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e 70  e) && .    (p->p
1400: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
1410: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1420: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
1430: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
1440: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1450: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1470: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1480: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
1490: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
14a0: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
14b0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
14c0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
14d0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
14e0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
14f0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
1500: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1510: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
1520: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
1530: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
1540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1550: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1560: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1570: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
1580: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
1590: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
15a0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
15b0: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
15c0: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
15d0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
15e0: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
15f0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
1600: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
1610: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1620: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
1630: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1660: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1670: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
1680: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
1690: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
16a0: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16b0: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
16c0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
16d0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
16e0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
16f0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1700: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
1710: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
1720: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
1730: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
1740: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1750: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1760: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1770: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
1780: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
1790: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
17a0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
17b0: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
17c0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
17d0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
17e0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
17f0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
1800: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
1810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1820: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
1830: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1840: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1850: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1860: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1870: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
1880: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
1890: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
18a0: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
18b0: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
18c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
18d0: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
18e0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
18f0: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
1900: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
1910: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
1920: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1930: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1940: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1950: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
1960: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
1970: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
1980: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
1990: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
19a0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 69  = *ppIter;.    i
19b0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
19c0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
19d0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
19e0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
19f0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a10: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1a20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1a30: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
1a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a50: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
1a60: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
1a70: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1a80: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
1a90: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
1aa0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
1ab0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
1ac0: 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  s a mutex on the
1ad0: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
1ae0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1af0: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
1b00: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
1b10: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
1b20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b30: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
1b40: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
1b50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b60: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1b70: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
1b80: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1b90: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1ba0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bc0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1bd0: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1be0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
1bf0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c00: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
1c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1c20: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
1c30: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1c40: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1c50: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1c60: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1c70: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
1c80: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
1c90: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
1ca0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
1cb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1cc0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
1cd0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
1ce0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1cf0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
1d00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d10: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1d20: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
1d30: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1d40: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1d50: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1d60: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
1d70: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
1d80: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
1d90: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20  erflowCache(x). 
1da0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1db0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1dc0: 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  che(x).#endif../
1dd0: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
1de0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1df0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
1e00: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
1e10: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
1e20: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
1e30: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
1e40: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
1e50: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
1e60: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
1e70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
1e80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ea0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
1ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
1ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f10: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1f20: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
1f30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f40: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
1f50: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
1f60: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
1f70: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
1f80: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
1f90: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
1fa0: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
1fb0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
1fc0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
1fd0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
1fe0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
1ff0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
2000: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
2010: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
2020: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
2030: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
2040: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
2050: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
2060: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2070: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70  OK && 0==pCur->p
2080: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
2090: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
20a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
20b0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
20c0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
20d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20e0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
20f0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
2100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2120: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
2130: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
2140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2150: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
2160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2180: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
21a0: 28 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ( !pCur->pPage->
21b0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
21c0: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
21d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
21f0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2200: 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2210: 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   0;.    pCur->eS
2220: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
2230: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
2240: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
2250: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
2260: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2270: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
2280: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
2290: 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20   cursors except 
22a0: 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20  pExcept open on 
22b0: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69  the table .** wi
22c0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
22d0: 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  ot. Usually, thi
22e0: 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  s is called just
22f0: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a   before cursor.*
2300: 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  * pExcept is use
2310: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  d to modify the 
2320: 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65  table (BtreeDele
2330: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
2340: 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ert())..*/.stati
2350: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
2360: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
2370: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
2380: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
2390: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
23a0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
23b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
23d0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
23e0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
23f0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
2400: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
2410: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
2420: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
2430: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
2440: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
2450: 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20  ==iRoot) && .   
2460: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
2470: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2480: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
2490: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
24a0: 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(p);.      if( 
24b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
24c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24d0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
24e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
24f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2500: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
2510: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2520: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2530: 76 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f 72  void clearCursor
2540: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
2550: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
2560: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2570: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2580: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2590: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
25a0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
25b0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
25d0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
25e0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
25f0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
2600: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
2610: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
2620: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
2630: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
2640: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
2650: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
2660: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
2670: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
2680: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
2690: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
26a0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
26b0: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
26c0: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
26d0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
26e0: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
26f0: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
2700: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2710: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
2720: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2730: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
2740: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
2750: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
2760: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
2770: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
2780: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
2790: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
27a0: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
27b0: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
27c0: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
27d0: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69  OR_INVALID..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
27f0: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2800: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2810: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2820: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2830: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2840: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2850: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2860: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2870: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
2880: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2890: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
28a0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28b0: 69 70 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ip;.  }.#ifndef 
28c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
28d0: 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72 2d  BLOB.  if( pCur-
28e0: 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
28f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2900: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
2910: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72 2d  }.#endif.  pCur-
2920: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2930: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
2940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2950: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
2960: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
2970: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2980: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2990: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
29a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
29b0: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
29c0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
29d0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29e0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29f0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2a00: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2a10: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2a30: 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  e restoreOrClear
2a40: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2a50: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
2a60: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2a70: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
2a80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2a90: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2aa0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
2ab0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
2ac0: 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK)..#ifndef S
2ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2ae0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
2af0: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
2b00: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
2b10: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
2b20: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
2b30: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
2b40: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
2b50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2b60: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
2b70: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
2b80: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
2b90: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
2ba0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2bb0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
2bc0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
2bd0: 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65 74  ge, iPtrMap, ret
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2bf0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2c10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
2c20: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
2c30: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
2c40: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
2c50: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
2c60: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
2c70: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
2c80: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
2c90: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
2ca0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2cb0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
2cc0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
2cd0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
2ce0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
2cf0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
2d00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
2d10: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
2d20: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
2d30: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
2d40: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
2d50: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
2d60: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
2d70: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
2d80: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
2d90: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2da0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
2db0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
2dc0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
2dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2de0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
2df0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
2e00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
2e10: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
2e20: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
2e30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
2e40: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
2e50: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
2e60: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
2e70: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
2e80: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
2e90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
2ea0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
2eb0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
2ec0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
2ed0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2ee0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2ef0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f00: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f10: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
2f20: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
2f30: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
2f40: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
2f50: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
2f60: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
2f70: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
2f80: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
2f90: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
2fa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
2fb0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2fc0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
2fd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fe0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ff0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
3000: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
3010: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
3020: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3030: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
3040: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
3050: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
3070: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
3080: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
3090: 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29  OFFSET(pBt, key)
30a0: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
30b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
30c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
30d0: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
30e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
30f0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
3100: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
3110: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
3120: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
3130: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
3140: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
3150: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
3160: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
3170: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
3180: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
31b0: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
31c0: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
31d0: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
31e0: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
31f0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
3200: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
3210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3220: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
3230: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
3240: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
3250: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
3260: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
3270: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
3280: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
3290: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
32a0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
32b0: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
32c0: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
32d0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
32e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
32f0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
3300: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
3310: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
3320: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
3330: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
3340: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
3350: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
3360: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
3370: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
3380: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
3390: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
33a0: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
33b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
33c0: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
33d0: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
33e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
33f0: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
3400: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
3410: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
3420: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
3430: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
3440: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3450: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3460: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3470: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
3480: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
3490: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
34a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
34c0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
34d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
34e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34f0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
3500: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
3510: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
3520: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
3530: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
3540: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73  (pBt, key);.  as
3550: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
3560: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
3570: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
3580: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
3590: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
35a0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
35b0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
35c0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
35d0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
35e0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
35f0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3600: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
3610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3620: 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
3630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
3640: 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
3650: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
3660: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
3670: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
3680: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
3690: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
36a0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
36b0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
36c0: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
36d0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
36e0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
36f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3700: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
3710: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
3720: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3730: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
3740: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ine findCell(pPa
3750: 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28  ge, iCell) \.  (
3760: 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20 2b  (pPage)->aData +
3770: 20 67 65 74 32 62 79 74 65 28 26 28 70 50 61 67   get2byte(&(pPag
3780: 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67 65  e)->aData[(pPage
3790: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
37a0: 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65  (iCell)])).#ifde
37b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75 38  f SQLITE_TEST.u8
37c0: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69   *sqlite3BtreeFi
37d0: 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  ndCell(MemPage *
37e0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
37f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  ){.  assert( iCe
3800: 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll>=0 );.  asser
3810: 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79 74  t( iCell<get2byt
3820: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
3830: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
3840: 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  +3]) );.  return
3850: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3860: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   iCell);.}.#endi
3870: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  f../*.** This a 
3880: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
3890: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42  sion of sqlite3B
38a0: 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74  treeFindCell() t
38b0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
38c0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
38d0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
38e0: 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65  cells.  See inse
38f0: 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  rt.*/.static u8 
3900: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
3910: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
3920: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
3930: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
3940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
3960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
3970: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
3980: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
3990: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
39a0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
39b0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
39c0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
39d0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
39e0: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
39f0: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
3a00: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
3a10: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
3a20: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
3a30: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
3a40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
3a50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
3a60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
3a70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
3a80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
3a90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
3aa0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
3ab0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
3ac0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
3ad0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
3ae0: 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74  function.  sqlit
3af0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3b00: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
3b10: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
3b20: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
3b30: 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65   and sqlite3Btre
3b40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
3b50: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
3b60: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
3b70: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
3b80: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
3b90: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
3ba0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
3bb0: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
3bc0: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
3bd0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71  instead of.** sq
3be0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3bf0: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
3c00: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
3c10: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
3c20: 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
3c30: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3c40: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
3c50: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
3c60: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
3c70: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
3c80: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
3c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3ca0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
3cb0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
3cc0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
3cd0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
3ce0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
3cf0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  .){.  int n;    
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d10: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
3d20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
3d30: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
3d40: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
3d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d60: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
3d70: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
3d80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
3da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
3db0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
3dc0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
3dd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
3de0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
3df0: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
3e00: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
3e10: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
3e20: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
3e30: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
3e40: 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67  ta ){.    n += g
3e50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
3e60: 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29  l[n], &nPayload)
3e70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3e80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d  Payload = 0;.  }
3e90: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20  .  pInfo->nData 
3ea0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66  = nPayload;.  if
3eb0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
3ec0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3ed0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
3ee0: 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e   (u64 *)&pInfo->
3ef0: 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
3f00: 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e      u32 x;.    n
3f10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3f20: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a  &pCell[n], &x);.
3f30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
3f40: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
3f50: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
3f60: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
3f70: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
3f80: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
3f90: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
3fa0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
3fb0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
3fc0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
3fd0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
3fe0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
3ff0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
4000: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
4010: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
4020: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4030: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
4040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
4050: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
4060: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
4070: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
4080: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
4090: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
40a0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
40b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
40c0: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
40d0: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
40e0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
40f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
4100: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
4110: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4120: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4130: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4140: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4150: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4160: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4170: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4180: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4190: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
41a0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
41b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
41c0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
41d0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
41e0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
41f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
4200: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
4210: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4220: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4230: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4240: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4250: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4260: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4270: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4290: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
42a0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
42b0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
42c0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
42d0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
42e0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
42f0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
4300: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
4310: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4320: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4330: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4340: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4350: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4360: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4370: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4380: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4390: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
43a0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
43b0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
43c0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
43d0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
43e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
43f0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
4400: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
4410: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4420: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4430: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4440: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4450: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4460: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4470: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4480: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4490: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
44a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
44b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
44c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
44d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
44e0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
44f0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
4500: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
4510: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4520: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4530: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4540: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4550: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4560: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4570: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4580: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4590: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
45a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
45b0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
45c0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
45d0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
45e0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
45f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4610: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4620: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4630: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4640: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4650: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4660: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4670: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4680: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4690: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
46a0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
46b0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
46c0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
46d0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
46e0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
46f0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4700: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4710: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4720: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4730: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4740: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4750: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4760: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4770: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4780: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4790: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
47a0: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  int cellSize(Mem
47b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
47c0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
47d0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
47e0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
47f0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4800: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4810: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4820: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
4830: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4850: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4860: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4870: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4880: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4890: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
48a0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
48b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
48d0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
48e0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
48f0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4900: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4910: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4920: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4930: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4940: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4950: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4960: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4970: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4980: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4990: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
49a0: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
49b0: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
49c0: 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nfo;.    sqlite3
49d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
49e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
49f0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
4a00: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4a10: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4a20: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4a30: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4a40: 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
4a50: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4a60: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4a70: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4a80: 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
4a90: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
4aa0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
4ab0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4ac0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
4ad0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
4ae0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
4af0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
4b00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4b20: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
4b30: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
4b40: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
4b50: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4b60: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4b70: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4b80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4b90: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4ba0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4bb0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4bc0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4bd0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
4be0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
4bf0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
4c00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c10: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
4c20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4c30: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
4c40: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
4c50: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
4c60: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
4c70: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
4c80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
4c90: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
4ca0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
4cb0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
4cc0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
4cd0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
4ce0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
4cf0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
4d00: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
4d10: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
4d20: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
4d30: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
4d40: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
4d50: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
4d60: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
4d70: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
4d80: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
4d90: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
4da0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4db0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
4dc0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
4dd0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
4de0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4df0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
4e00: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
4e30: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
4e40: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
4e50: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
4e80: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
4e90: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4eb0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
4ec0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
4ed0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4ee0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
4ef0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
4f00: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
4f10: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
4f20: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
4f30: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
4f40: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
4f50: 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
4f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4f70: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
4f80: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
4f90: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4fb0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
4fc0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
4fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
4fe0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
4ff0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
5000: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5010: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
5020: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
5030: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
5040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5050: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5060: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
5080: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5090: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
50a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
50b0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
50c0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
50d0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
50e0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  temp = sqlite3_m
5130: 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42  alloc( pPage->pB
5140: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
5150: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72   if( temp==0 ) r
5160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5170: 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  EM;.  data = pPa
5180: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
5190: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
51a0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
51b0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
51c0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
51d0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
51e0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
51f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5200: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
5210: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
5220: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
5230: 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
5240: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5250: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
5260: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
5270: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62  , usableSize - b
5280: 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61  rk);.  brk = usa
5290: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
52a0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
52b0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
52c0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
52d0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
52e0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
52f0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
5300: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
5310: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
5320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
5330: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5340: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
5350: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
5360: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
5370: 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73  ]);.    brk -= s
5380: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ize;.    memcpy(
5390: 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d  &data[brk], &tem
53a0: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
53b0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
53c0: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73  , brk);.  }.  as
53d0: 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f  sert( brk>=cellO
53e0: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
53f0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
5400: 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a  a[hdr+5], brk);.
5410: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
5420: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
5430: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
5440: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
5450: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
5460: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
5470: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62  data[addr], 0, b
5480: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  rk-addr);.  sqli
5490: 74 65 33 5f 66 72 65 65 28 74 65 6d 70 29 3b 0a  te3_free(temp);.
54a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
54b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
54c0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
54d0: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
54e0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
54f0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
5500: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
5510: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
5520: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
5530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20   allocation. Or 
5540: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  return 0 if ther
5550: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
5560: 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e  free.** space on
5570: 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74   the page to sat
5580: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
5590: 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  ion request..**.
55a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
55b0: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
55c0: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
55d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
55e0: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
55f0: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
5600: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
5610: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
5620: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
5630: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
5640: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
5650: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
5660: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
5670: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
5680: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
5690: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
56a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
56b0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
56c0: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
56d0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
56e0: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
56f0: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
5700: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
5710: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
5720: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
5730: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
5740: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
5750: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5760: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5770: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5780: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
57a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
57b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
57c0: 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ) );.  if( nByte
57d0: 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a  <4 ) nByte = 4;.
57e0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72    if( pPage->nFr
57f0: 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67  ee<nByte || pPag
5800: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
5810: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61   return 0;.  pPa
5820: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79  ge->nFree -= nBy
5830: 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  te;.  hdr = pPag
5840: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20  e->hdrOffset;.. 
5850: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
5860: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
5870: 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  g<60 ){.    /* S
5880: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
5890: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
58a0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
58b0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
58c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71      ** space req
58d0: 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64  uest. */.    add
58e0: 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77  r = hdr+1;.    w
58f0: 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32  hile( (pc = get2
5900: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
5910: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69  ))>0 ){.      si
5920: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
5930: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
5940: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
5950: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
5960: 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b   size<nByte+4 ){
5970: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5980: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
5990: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
59a0: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
59b0: 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69  +7] = nFrag + si
59c0: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
59d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b        return pc;
59e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
59f0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
5a00: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
5a10: 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20  size-nByte);.   
5a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5a30: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5a40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a50: 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
5a60: 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pc;.    }.  }.. 
5a70: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
5a80: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
5a90: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
5aa0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5ab0: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
5ac0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5ad0: 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  a..  */.  top = 
5ae0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5af0: 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20  dr+5]);.  nCell 
5b00: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5b10: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c  [hdr+3]);.  cell
5b20: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
5b30: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
5b40: 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63  ( nFrag>=60 || c
5b50: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5b60: 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74  ell > top - nByt
5b70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66  e ){.    if( def
5b80: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
5b90: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5ba0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5bb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5bc0: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5bd0: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5be0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5bf0: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5c00: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5c10: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5c20: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5c30: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5c40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5c50: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5c60: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5c70: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5c80: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5c90: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5ca0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5cb0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5cc0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5cd0: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5ce0: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5cf0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5d00: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5d10: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5d20: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5d30: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5d40: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5d50: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
5d60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5d70: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
5d80: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5d90: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
5da0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5db0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
5dc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
5dd0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5df0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5e00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5e10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
5e20: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
5e30: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
5e40: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
5e50: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
5e60: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
5e70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5e80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5e90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5ea0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5eb0: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20  );.  if( size<4 
5ec0: 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66  ) size = 4;..#if
5ed0: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
5ee0: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
5ef0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
5f00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
5f10: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
5f20: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
5f30: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
5f40: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
5f50: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
5f60: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
5f70: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
5f80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
5f90: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
5fa0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
5fb0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
5fc0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
5fd0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
5fe0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
5ff0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
6000: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
6010: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
6020: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
6030: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6040: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6050: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
6060: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6070: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
6080: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
6090: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
60a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
60b0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
60c0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
60d0: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
60e0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
60f0: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
6100: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6110: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
6120: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6130: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
6140: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
6150: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
6160: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
6170: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
6180: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
6190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
61a0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
61b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
61c0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
61d0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
61e0: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
61f0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
6200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6210: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6220: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6230: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
6240: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6250: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
6260: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
6270: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
6280: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
6290: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
62a0: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
62b0: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
62c0: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
62d0: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
62e0: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
62f0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
6300: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
6310: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
6320: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
6330: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
6340: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
6350: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6360: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
6370: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
6380: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
6390: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
63a0: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
63b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
63c0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
63d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
63e0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
63f0: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
6400: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
6410: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
6420: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
6430: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
6440: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
6450: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
6460: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
6470: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6480: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
6490: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
64a0: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
64b0: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
64c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
64d0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
64e0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
64f0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
6500: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6510: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
6520: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
6530: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
6540: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6550: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6560: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
6570: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
6580: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
6590: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
65a0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
65b0: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61  c void decodeFla
65c0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
65d0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
65e0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
65f0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
6600: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
6610: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
6620: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
6630: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
6640: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6650: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6660: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6670: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6680: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6690: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
66a0: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
66b0: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
66c0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
66d0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
66e0: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
66f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
6700: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
6710: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
6720: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
6730: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
6740: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
6750: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
6760: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6770: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
6780: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
6790: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
67a0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
67b0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
67c0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
67d0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
67e0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
67f0: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
6800: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6810: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
6820: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
6830: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
6840: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
6850: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
6860: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6870: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
6880: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
6890: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
68a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
68b0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
68c0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
68d0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
68e0: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
68f0: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
6900: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
6910: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
6920: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
6930: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
6940: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
6950: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
6960: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
6970: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
6980: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
6990: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
69b0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
69c0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
69d0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
69e0: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
69f0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
6a00: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
6a10: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
6a20: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
6a30: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
6a40: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
6a50: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
6a60: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
6a70: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
6a80: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
6a90: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
6aa0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
6ab0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6ac0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20  BtreeInitPage(. 
6ad0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6ae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6af0: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
6b00: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
6b10: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
6b20: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
6b30: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
6b40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
6b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6b60: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
6b70: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
6b80: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
6b90: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
6ba0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6bb0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
6bc0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
6bd0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
6be0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
6bf0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
6c00: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
6c20: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
6c30: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
6c40: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
6c50: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
6c60: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
6c70: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
6c80: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
6c90: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
6ca0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
6cb0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
6cc0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
6cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ce0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
6cf0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
6d00: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
6d10: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
6d20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
6d30: 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42  nt area */..  pB
6d40: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6d50: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
6d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d70: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
6d80: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
6d90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6da0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6dc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
6dd0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
6de0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
6df0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6e00: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
6e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
6e20: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
6e30: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6e40: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
6e50: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
6e60: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
6e70: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
6e80: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
6e90: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
6ea0: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
6eb0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
6ec0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
6ed0: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
6ee0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
6ef0: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
6f00: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
6f10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6f20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
6f30: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
6f40: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
6f50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
6f60: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
6f70: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
6f80: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
6f90: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
6fa0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
6fb0: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
6fc0: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
6fd0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
6fe0: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
6ff0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
7000: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7010: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
7020: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
7030: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
7040: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
7050: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
7060: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
7070: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
7080: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
7090: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
70a0: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
70b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
70c0: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
70d0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
70e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
70f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
7100: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
7110: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
7120: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
7130: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
7140: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
7150: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
7160: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7170: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
7180: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
7190: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
71a0: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
71b0: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
71c0: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
71d0: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
71e0: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
71f0: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
7200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7210: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7220: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
7230: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
7240: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
7250: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
7260: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
7270: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
7280: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
7290: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
72a0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
72b0: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
72c0: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
72d0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
72e0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
72f0: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
7300: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
7310: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
7320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7330: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
7340: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
7350: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
7360: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
7370: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
7380: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
7390: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
73a0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
73b0: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
73c0: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
73d0: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
73e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
73f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7400: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
7410: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
7420: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
7430: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
7440: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
7450: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
7460: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7470: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7480: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
7490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
74a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
74b0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d 3e 69  .  }..  pPage->i
74c0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  sInit = 1;.  ret
74d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
74e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
74f0: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
7500: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
7510: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
7520: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
7530: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
7540: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
7550: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
7560: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
7570: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7580: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7590: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
75a0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
75b0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
75c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
75d0: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
75e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
75f0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
7600: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
7610: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
7620: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7630: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
7640: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
7650: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
7660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7670: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
7680: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
7690: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
76a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
76b0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
76c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
76d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
76e0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
76f0: 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  tex) );.  memset
7700: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
7710: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7720: 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68  - hdr);.  data[h
7730: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
7740: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
7750: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
7760: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
7770: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
7780: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
7790: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
77a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
77b0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
77c0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
77d0: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
77e0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
77f0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7800: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
7810: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
7820: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
7830: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
7840: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
7850: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
7860: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
7870: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0;.  pPage->nCel
7880: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
7890: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  isInit = 1;.}../
78a0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
78b0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
78c0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
78d0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
78e0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
78f0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
7900: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
7910: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
7920: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
7930: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
7940: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
7950: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
7960: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
7970: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
7980: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
7990: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
79a0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
79b0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
79c0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
79d0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
79e0: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
79f0: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
7a00: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
7a10: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
7a20: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
7a30: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
7a40: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
7a50: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
7a60: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
7a70: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
7a80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7a90: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
7aa0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
7ab0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
7ac0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
7ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ae0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
7af0: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
7b00: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
7b10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
7b20: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
7b30: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
7b40: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
7b50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
7b60: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
7b70: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
7b80: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
7b90: 20 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67   *pPage;.  DbPag
7ba0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
7bb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7bc0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7bd0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
7be0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
7bf0: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
7c00: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
7c10: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
7c20: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
7c30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
7c40: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
7c50: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7c60: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
7c70: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
7c80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
7c90: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7ca0: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
7cb0: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
7cc0: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
7cd0: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
7ce0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
7cf0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7d00: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
7d10: 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  : 0;.  *ppPage =
7d20: 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   pPage;.  return
7d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7d40: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
7d50: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
7d60: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
7d70: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
7d80: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
7d90: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
7da0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
7db0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
7dc0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7dd0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
7de0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
7df0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
7e00: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
7e10: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
7e20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
7e30: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e40: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
7e50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7e60: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
7e70: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
7e80: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
7e90: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
7ea0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
7eb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
7ec0: 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  t     /* Parent 
7ed0: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29  of the page */.)
7ee0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
7ef0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7f00: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7f10: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7f20: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
7f30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7f40: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20  PT_BKPT; .  }.  
7f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
7f60: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
7f70: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
7f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7f90: 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29  _OK && (*ppPage)
7fa0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
7fb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
7fc0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
7fd0: 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  Page, pParent);.
7fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
8000: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
8010: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
8020: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
8030: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
8040: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
8050: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
8060: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
8070: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8080: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
8090: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
80a0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
80b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
80c0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
80d0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
80e0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
80f0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
8100: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  id*)pPage );.   
8110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8120: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
8130: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
8140: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
8150: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8160: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8170: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
8190: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
81a0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
81b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
81c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
81d0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
81e0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
81f0: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
8200: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
8210: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
8220: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
8230: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
8240: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8250: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
8260: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8270: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8280: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
8290: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
82a0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
82b0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
82c0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
82d0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
82e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
82f0: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  sInit==0 || sqli
8300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8310: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8320: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
8330: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
8340: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
8350: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
8360: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
8370: 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50  pParent->pBt==pP
8380: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
8390: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
83a0: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
83b0: 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
83c0: 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
83d0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
83e0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
83f0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
8400: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
8410: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
8420: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
8430: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
8440: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
8450: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
8460: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
8470: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
8480: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
8490: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
84a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
84b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
84c0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
84d0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
84e0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
84f0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
8500: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
8510: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
8520: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
8530: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
8540: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8550: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8560: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
8570: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
8580: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
8590: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
85a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
85b0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
85c0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
85d0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
85e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
85f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8600: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
8610: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
8620: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
8630: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
8640: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
8650: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
8660: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
8670: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
8680: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
8690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
86a0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
86b0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
86c0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
86d0: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
86e0: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
86f0: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
8700: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
8710: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
8720: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
8730: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
8740: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
8750: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
8760: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
8770: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8780: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
8790: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
87a0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
87b0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
87c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
87d0: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
87e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
87f0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
8800: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8810: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
8820: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
8830: 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20  ite3 *pSqlite,  
8840: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
8850: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
8860: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
8870: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
8880: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
8890: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
88a0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
88b0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
88c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
88d0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
88e0: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
88f0: 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
8900: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
8910: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8920: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
8930: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
8940: 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73  /* The VFS to us
8950: 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65  e for this btree
8960: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
8970: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  pBt = 0;      /*
8980: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
8990: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
89a0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89c0: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
89d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
89e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
89f0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69  nReserve;.  unsi
8a00: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
8a10: 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20  der[100];..  /* 
8a20: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
8a30: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
8a40: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
8a50: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
8a60: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
8a70: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
8a80: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
8a90: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
8aa0: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
8ab0: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
8ac0: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
8ad0: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
8ae0: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
8af0: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
8b00: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
8b10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8b20: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
8b30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8b40: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
8b50: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
8b60: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
8b70: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
8b80: 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73  emdb = 0;.  #els
8b90: 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
8ba0: 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e  isMemdb = zFilen
8bb0: 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a  ame && !strcmp(z
8bc0: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
8bd0: 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ry:");.  #endif.
8be0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8bf0: 28 20 70 53 71 6c 69 74 65 21 3d 30 20 29 3b 0a  ( pSqlite!=0 );.
8c00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8c10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 71  3_mutex_held(pSq
8c20: 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  lite->mutex) );.
8c30: 0a 20 20 70 56 66 73 20 3d 20 70 53 71 6c 69 74  .  pVfs = pSqlit
8c40: 65 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  e->pVfs;.  p = s
8c50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
8c60: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
8c70: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
8c80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8c90: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
8ca0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
8cb0: 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74  ONE;.  p->pSqlit
8cc0: 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 23 69  e = pSqlite;..#i
8cd0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8ce0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
8cf0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
8d00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
8d10: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
8d20: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
8d30: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
8d40: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
8d50: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
8d60: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
8d70: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
8d80: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
8d90: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 66 6c  h.  */.  if( (fl
8da0: 61 67 73 20 26 20 42 54 52 45 45 5f 50 52 49 56  ags & BTREE_PRIV
8db0: 41 54 45 29 3d 3d 30 0a 20 20 20 26 26 20 69 73  ATE)==0.   && is
8dc0: 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 28  Memdb==0.   && (
8dd0: 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 26  pSqlite->flags &
8de0: 20 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30   SQLITE_Vtab)==0
8df0: 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  .   && zFilename
8e00: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
8e10: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  .  ){.    if( sq
8e20: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
8e30: 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20  Enabled ){.     
8e40: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
8e50: 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 73  name = (char *)s
8e60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56  qlite3_malloc(pV
8e70: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b  fs->mxPathname);
8e80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
8e90: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
8ea0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
8eb0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
8ec0: 69 66 28 20 70 53 71 6c 69 74 65 20 29 7b 0a 20  if( pSqlite ){. 
8ed0: 20 20 20 20 20 20 20 70 53 71 6c 69 74 65 2d 3e         pSqlite->
8ee0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8ef0: 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20  SharedCache;.   
8f00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8f10: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
8f20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8f30: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
8f40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
8f60: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
8f70: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
8f80: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c   zFilename, zFul
8f90: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
8fa0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
8fb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
8fc0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
8fd0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
8fe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
8ff0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9000: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9010: 6f 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68  or(pBt=sqlite3Sh
9020: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70  aredCacheList; p
9030: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
9040: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
9050: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
9060: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9070: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
9080: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
9090: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
90a0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
90c0: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
90d0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
90e0: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
90f0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9100: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
9110: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
9120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9150: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
9160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9170: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
9180: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
9190: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
91a0: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
91b0: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
91c0: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
91d0: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
91e0: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
91f0: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
9200: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
9210: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
9220: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
9230: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
9240: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
9250: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
9260: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9270: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
9280: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
9290: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
92a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
92b0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
92c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
92d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
92e0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
92f0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
9300: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
9310: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
9320: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
9330: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
9340: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
9350: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
9360: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
9370: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
9380: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
9390: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
93a0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
93b0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
93c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
93d0: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
93e0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
93f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9400: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
9410: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
9420: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9430: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
9440: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9450: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
9460: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9470: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
9480: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
9490: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
94a0: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
94b0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
94c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
94d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
94e0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
94f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
9500: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
9510: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
9520: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
9530: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9540: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
9550: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
9560: 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  fsFlags);.    if
9570: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9580: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9590: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
95a0: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
95b0: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
95c0: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
95d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
95e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
95f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
9600: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
9610: 20 7d 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20   }.    p->pBt = 
9620: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
9630: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
9640: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
9650: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
9660: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
9670: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
9680: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9690: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
96a0: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
96b0: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
96c0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
96d0: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
96e0: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
96f0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
9700: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
9710: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
9720: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
9730: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
9740: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
9750: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
9760: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
9770: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
9780: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
9790: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
97a0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
97b0: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
97c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
97d0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
97e0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
97f0: 7a 65 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ze);.      pBt->
9800: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 36  maxEmbedFrac = 6
9810: 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20  4;   /* 25% */. 
9820: 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62       pBt->minEmb
9830: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
9840: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 20  * 12.5% */.     
9850: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9860: 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32  c = 32;    /* 12
9870: 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  .5% */.#ifndef S
9880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9890: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
98a0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
98b0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
98c0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
98d0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
98e0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
98f0: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
9900: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
9910: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
9920: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
9930: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
9940: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
9950: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
9960: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
9970: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
9980: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
9990: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
99a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
99b0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
99c0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
99d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
99e0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
99f0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
9a00: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
9a10: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
9a20: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
9a30: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
9a40: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
9a50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
9a60: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
9a70: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
9a80: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
9a90: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9aa0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
9ab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
9ac0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
9ad0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
9ae0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
9af0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
9b00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  .      pBt->maxE
9b10: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
9b20: 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 20 20  ader[21];.      
9b30: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
9b40: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
9b50: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  ];.      pBt->mi
9b60: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
9b70: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 20  eader[23];.     
9b80: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
9b90: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
9ba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9bb0: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
9bc0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
9bd0: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
9be0: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
9bf0: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
9c00: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
9c10: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
9c20: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
9c30: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
9c40: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
9c50: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
9c60: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
9c70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
9c80: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
9c90: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
9ca0: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
9cb0: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ageSize */.    s
9cc0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
9cd0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
9ce0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
9cf0: 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65  ze);.   .#if !de
9d00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9d10: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9d20: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
9d30: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
9d40: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
9d50: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
9d60: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
9d70: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
9d80: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
9d90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
9da0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
9db0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
9dc0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
9dd0: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
9de0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
9df0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
9e00: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
9e10: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
9e20: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
9e30: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9e40: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
9e50: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
9e60: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
9e70: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
9e80: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
9e90: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
9ea0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
9eb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9ec0: 20 20 20 20 70 53 71 6c 69 74 65 2d 3e 6d 61 6c      pSqlite->mal
9ed0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
9ee0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
9ef0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
9f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9f20: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
9f30: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
9f40: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
9f50: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
9f60: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9f70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
9f80: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
9f90: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9fa0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9fb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
9fc0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9fe0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a000: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
a010: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
a020: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
a030: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
a040: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
a050: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
a060: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
a070: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
a080: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
a090: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
a0a0: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
a0b0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
a0c0: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
a0d0: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
a0e0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
a0f0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
a100: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
a110: 69 3c 70 53 71 6c 69 74 65 2d 3e 6e 44 62 3b 20  i<pSqlite->nDb; 
a120: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
a130: 28 70 53 69 62 20 3d 20 70 53 71 6c 69 74 65 2d  (pSib = pSqlite-
a140: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
a150: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
a160: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
a170: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
a180: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
a190: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
a1a0: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
a1b0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
a1c0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
a1d0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
a1e0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
a1f0: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
a200: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
a210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a220: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
a230: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
a240: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
a250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
a260: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
a270: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a280: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
a290: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
a2a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
a2b0: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
a2c0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
a2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a2e0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
a2f0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
a300: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
a310: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
a320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
a330: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a340: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a350: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
a360: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
a370: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a380: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
a390: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
a3a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a3b0: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
a3c0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
a3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a3e0: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
a3f0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
a400: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
a410: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a420: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
a430: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
a440: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
a450: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
a460: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
a470: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
a480: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
a490: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
a4a0: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
a4b0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
a4c0: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
a4d0: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
a4e0: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
a4f0: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
a500: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a510: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
a520: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
a530: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
a540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a550: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
a560: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
a570: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
a580: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
a590: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
a5a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a5b0: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
a5c0: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
a5d0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  r = sqlite3_mute
a5e0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
a5f0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
a600: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
a610: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
a620: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
a630: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
a640: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
a650: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
a660: 61 63 68 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b  acheList==pBt ){
a670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 68  .      sqlite3Sh
a680: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
a690: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
a6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
a6b0: 73 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72  st = sqlite3Shar
a6c0: 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20  edCacheList;.   
a6d0: 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20     while( pList 
a6e0: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
a6f0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
a700: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
a710: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a720: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
a730: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
a740: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
a750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a760: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
a770: 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
a780: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
a790: 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
a7a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
a7b0: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
a7c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a7d0: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
a7e0: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
a7f0: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
a800: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a810: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
a820: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
a830: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
a840: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
a850: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
a860: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
a870: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
a880: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
a890: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
a8a0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
a8b0: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
a8c0: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
a8d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a8e0: 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  _held(p->pSqlite
a8f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
a900: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
a910: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
a920: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
a930: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
a940: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
a950: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
a960: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
a970: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
a980: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
a990: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a9a0: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
a9b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
a9c0: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
a9d0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
a9e0: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
a9f0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
aa00: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
aa10: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
aa20: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
aa30: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
aa40: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
aa50: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
aa60: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
aa70: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
aa80: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
aa90: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
aaa0: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
aab0: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
aac0: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
aad0: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
aae0: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
aaf0: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
ab00: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
ab10: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
ab20: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
ab30: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
ab40: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
ab50: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
ab60: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
ab70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
ab80: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
ab90: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
aba0: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
abb0: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
abc0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
abd0: 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
abe0: 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
abf0: 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
ac00: 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
ac10: 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
ac20: 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
ac30: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
ac40: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
ac50: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
ac60: 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
ac70: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ac80: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
ac90: 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
aca0: 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
acb0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
acc0: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
acd0: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
ace0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
acf0: 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
ad00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ad10: 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
ad20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
ad40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
ad50: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
ad60: 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
ad70: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
ad80: 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
ad90: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
ada0: 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
adb0: 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
adc0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
add0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
ade0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
adf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ae00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ae10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ae20: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
ae30: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
ae40: 74 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48  te3BtreeSetBusyH
ae50: 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c  andler(Btree *p,
ae60: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48   BusyHandler *pH
ae70: 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61  andler){.  BtSha
ae80: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ae90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
aea0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
aeb0: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  p->pSqlite->mute
aec0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
aed0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
aee0: 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
aef0: 72 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20  r = pHandler;.  
af00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
af10: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
af20: 70 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72  pPager, pHandler
af30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
af40: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
af50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
af60: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
af70: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
af80: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
af90: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
afa0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
afb0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
afc0: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
afd0: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
afe0: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
aff0: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b000: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b010: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b020: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
b030: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
b040: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
b050: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
b060: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
b070: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b080: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
b090: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
b0a0: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
b0b0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
b0c0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b0d0: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
b0e0: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
b0f0: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
b100: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
b110: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
b120: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
b130: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
b140: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
b150: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
b160: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
b170: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
b180: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
b190: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
b1a0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b1b0: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
b1c0: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
b1d0: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
b1e0: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
b1f0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
b200: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
b210: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
b220: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
b230: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
b240: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
b250: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b260: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b270: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b280: 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
b290: 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  e->mutex) );.  s
b2a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b2b0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
b2c0: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
b2d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
b2e0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
b2f0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
b300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
b320: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
b330: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
b340: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
b350: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
b360: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
b370: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
b380: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
b390: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
b3a0: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
b3b0: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
b3c0: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
b3d0: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
b3e0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
b3f0: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
b400: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b410: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
b420: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
b430: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
b440: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
b450: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
b460: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
b470: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
b480: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
b490: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
b4a0: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
b4b0: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
b4c0: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
b4d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b4e0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
b4f0: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
b500: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
b510: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
b520: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
b530: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
b540: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b550: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b560: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b570: 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
b580: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
b590: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
b5a0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
b5b0: 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
b5c0: 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
b5d0: 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
b5e0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b5f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b600: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
b610: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
b620: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
b630: 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
b640: 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
b650: 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
b660: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
b670: 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
b680: 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
b690: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
b6a0: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
b6b0: 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
b6c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b6d0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
b6e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
b6f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b700: 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74  (p->pSqlite->mut
b710: 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
b720: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
b730: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
b740: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
b750: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
b760: 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
b770: 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
b780: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b790: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b7a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b7b0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
b7c0: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
b7d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b7e0: 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
b7f0: 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
b800: 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
b810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b820: 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
b830: 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r page..**.** Th
b840: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
b850: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
b860: 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
b870: 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
b880: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
b890: 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
b8a0: 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
b8b0: 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
b8c0: 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
b8d0: 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
b8e0: 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
b8f0: 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
b900: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
b910: 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
b920: 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
b930: 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
b940: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
b950: 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
b960: 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
b970: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
b980: 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
b990: 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
b9a0: 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
b9b0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
b9c0: 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
b9d0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
b9e0: 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
b9f0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
ba00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
ba10: 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
ba20: 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
ba30: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
ba40: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
ba50: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
ba60: 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
ba70: 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
ba80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ba90: 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
baa0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bab0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bac0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
bad0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
bae0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
baf0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
bb00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb10: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
bb20: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
bb30: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
bb40: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
bb50: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
bb60: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
bb70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
bb80: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
bb90: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
bba0: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
bbb0: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
bbc0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
bbd0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
bbe0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
bbf0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
bc00: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
bc10: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
bc20: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
bc30: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
bc40: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
bc50: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
bc60: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
bc70: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
bc80: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
bc90: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
bca0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
bcb0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
bcc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bcd0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
bce0: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
bcf0: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
bd00: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
bd10: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
bd20: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
bd30: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
bd40: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
bd50: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
bd60: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
bd70: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
bd80: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
bd90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
bda0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bdb0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
bdc0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
bdd0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
bde0: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
bdf0: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
be00: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
be10: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
be20: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
be30: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
be40: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
be50: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
be60: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
be70: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
be80: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
be90: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
bea0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
beb0: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
bec0: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
bed0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
bee0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
bef0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
bf00: 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
bf10: 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
bf20: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
bf30: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
bf40: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
bf50: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
bf60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
bf70: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
bf80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf90: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
bfa0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
bfb0: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
bfc0: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
bfd0: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
bfe0: 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
bff0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
c000: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
c010: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
c020: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
c030: 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
c040: 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
c050: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
c060: 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
c070: 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
c080: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
c090: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
c0a0: 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
c0b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c0c0: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
c0d0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
c0e0: 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
c0f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c100: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
c110: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c120: 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
c130: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c140: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
c150: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61  LITE_OK;.  int a
c160: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f  v = (autoVacuum?
c170: 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  1:0);..  sqlite3
c180: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c190: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c1a0: 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d 70  zeFixed && av!=p
c1b0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
c1c0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
c1d0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
c1e0: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
c1f0: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20  toVacuum = av;. 
c200: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
c210: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c220: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c240: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c250: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
c260: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
c270: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
c280: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
c290: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
c2a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c2b0: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
c2c0: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
c2d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
c2e0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
c2f0: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
c300: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
c310: 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
c320: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c330: 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
c340: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
c350: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
c360: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
c370: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
c380: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c390: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
c3a0: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
c3b0: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
c3c0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c3d0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c3e0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
c3f0: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
c400: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
c410: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c420: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
c430: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
c440: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
c450: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
c460: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
c470: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
c480: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
c490: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
c4a0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
c4b0: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
c4c0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
c4d0: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
c4e0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
c4f0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
c500: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
c510: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
c520: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
c530: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
c540: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
c550: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
c560: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
c570: 72 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  rc, pageSize;.  
c580: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
c590: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c5a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c5b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c5c0: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
c5d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c5e0: 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OK;.  rc = sqlit
c5f0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
c600: 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
c610: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
c620: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c630: 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f   rc;.  ..  /* Do
c640: 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
c650: 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
c660: 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
c670: 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
c680: 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
c690: 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
c6a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
c6b0: 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  B;.  if( sqlite3
c6c0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
c6d0: 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 7b  Bt->pPager)>0 ){
c6e0: 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
c6f0: 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
c700: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
c710: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
c720: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
c730: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c740: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
c750: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
c760: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
c770: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
c780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c790: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
c7a0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
c7b0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
c7c0: 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
c7d0: 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
c7e0: 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
c7f0: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
c800: 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
c810: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
c820: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
c830: 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
c840: 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
c850: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c860: 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
c870: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
c880: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
c890: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
c8a0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
c8b0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c8c0: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
c8d0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
c8e0: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
c8f0: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
c900: 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
c910: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
c920: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
c930: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
c940: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
c950: 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
c960: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
c970: 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
c980: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
c990: 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
c9a0: 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
c9b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c9c0: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
c9d0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
c9e0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
c9f0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
ca00: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
ca10: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
ca20: 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
ca30: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
ca40: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
ca50: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
ca60: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
ca70: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
ca80: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
ca90: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
caa0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
cab0: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
cac0: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
cad0: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
cae0: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
caf0: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
cb00: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
cb10: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
cb20: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
cb30: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
cb40: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
cb50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
cb60: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
cb70: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
cb80: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
cb90: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
cba0: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
cbb0: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
cbc0: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
cbd0: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
cbe0: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
cbf0: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
cc00: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
cc10: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
cc20: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
cc30: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
cc40: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
cc50: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
cc60: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
cc70: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
cc80: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
cc90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
cca0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
ccb0: 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65  12)*pBt->maxEmbe
ccc0: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
ccd0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
cce0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
ccf0: 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45  ze-12)*pBt->minE
cd00: 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32  mbedFrac/255 - 2
cd10: 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
cd20: 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
cd30: 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
cd40: 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
cd50: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
cd60: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
cd70: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28  /255 - 23;.  if(
cd80: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70   pBt->minLocal>p
cd90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20  Bt->maxLocal || 
cda0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20  pBt->maxLocal<0 
cdb0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
cdc0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
cdd0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
cde0: 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
cdf0: 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
ce00: 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
ce10: 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
ce20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ce30: 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
ce40: 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
ce50: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
ce60: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
ce70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ce80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ce90: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
cea0: 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
ceb0: 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
cec0: 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
ced0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
cee0: 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
cef0: 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
cf00: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
cf10: 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
cf20: 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
cf30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
cf40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cf50: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
cf60: 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70  pRef) );.  if( p
cf70: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  Ref->inTrans==TR
cf80: 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
cf90: 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
cfa0: 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e   = pRef->pBt->in
cfb0: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
cfc0: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
cfd0: 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  pRef);.    rc = 
cfe0: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
cff0: 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b  nTrans(pRef, 0);
d000: 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e  .    pRef->pBt->
d010: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
d020: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
d030: 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73     pRef->inTrans
d040: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
d050: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52  E_OK ){.      pR
d070: 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61  ef->pBt->nTransa
d080: 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ction--;.    }. 
d090: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
d0a0: 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72  y(pRef);.  }.  r
d0b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20  eturn rc;.}.    
d0c0: 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68     ../*.** If th
d0d0: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
d0e0: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
d0f0: 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
d100: 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
d110: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
d120: 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
d130: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
d140: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
d150: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
d160: 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
d170: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
d180: 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
d190: 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
d1a0: 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
d1b0: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
d1c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
d1d0: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
d1e0: 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20  g cursors, this 
d1f0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
d200: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
d210: 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
d220: 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
d230: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d240: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
d250: 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
d260: 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
d270: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
d280: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d290: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d2a0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
d2b0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
d2c0: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
d2d0: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
d2e0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
d2f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
d300: 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
d310: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
d320: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
d330: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
d340: 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
d350: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
d360: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
d370: 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44         pPage->aD
d380: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
d390: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d3a0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
d3b0: 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
d3c0: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61  pBt;.        pPa
d3d0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ge->pgno = 1;.  
d3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
d3f0: 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
d400: 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
d410: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
d420: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
d430: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
d440: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
d450: 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
d460: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
d470: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
d480: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
d490: 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
d4a0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
d4b0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
d4c0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
d4d0: 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
d4e0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
d4f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d500: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d510: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d520: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
d530: 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74  >pPager)>0 ) ret
d540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d550: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
d560: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
d570: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
d580: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
d590: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d5a0: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
d5b0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
d5c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
d5d0: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
d5e0: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
d5f0: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
d600: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
d610: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
d620: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
d630: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
d640: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
d650: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
d660: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
d670: 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
d680: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
d690: 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
d6a0: 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d  21] = pBt->maxEm
d6b0: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
d6c0: 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d  22] = pBt->minEm
d6d0: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
d6e0: 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  23] = pBt->minLe
d6f0: 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74  afFrac;.  memset
d700: 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
d710: 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
d720: 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
d730: 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
d740: 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
d750: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
d760: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
d770: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d780: 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
d790: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
d7a0: 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
d7b0: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
d7c0: 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
d7d0: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
d7e0: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
d7f0: 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
d800: 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
d810: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
d820: 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
d830: 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
d840: 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
d850: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
d860: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d870: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
d880: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
d890: 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
d8a0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
d8b0: 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
d8c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
d8d0: 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
d8e0: 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
d8f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
d900: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d910: 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
d920: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
d930: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
d940: 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
d950: 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
d960: 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
d970: 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
d990: 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
d9a0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
d9b0: 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
d9c0: 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
d9d0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
d9e0: 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
d9f0: 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
da00: 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
da10: 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
da20: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
da30: 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
da40: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
da50: 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
da60: 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
da70: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
da80: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
da90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
daa0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
dab0: 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
dac0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
dad0: 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
dae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
daf0: 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
db00: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
db10: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
db20: 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
db30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
db40: 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
db50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
db60: 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
db70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
db80: 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
db90: 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
dba0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
dbb0: 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
dbc0: 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
dbd0: 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
dbe0: 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
dbf0: 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
dc00: 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
dc10: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
dc20: 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
dc30: 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
dc40: 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
dc50: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
dc60: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
dc70: 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
dc80: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
dc90: 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
dca0: 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
dcb0: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
dcc0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
dcd0: 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
dce0: 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
dcf0: 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
dd00: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
dd10: 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
dd20: 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
dd30: 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
dd40: 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
dd50: 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
dd60: 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
dd70: 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
dd80: 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
dd90: 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
dda0: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
ddb0: 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
ddc0: 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
ddd0: 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
dde0: 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
ddf0: 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
de00: 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
de10: 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
de20: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
de30: 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
de40: 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
de50: 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
de60: 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
de70: 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
de80: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
de90: 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
dea0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
deb0: 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
dec0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
ded0: 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
dee0: 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
def0: 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
df00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
df10: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
df20: 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
df30: 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
df40: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
df50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
df60: 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
df70: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
df80: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
df90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
dfa0: 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
dfb0: 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
dfc0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
dfd0: 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
dfe0: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
dff0: 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
e000: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
e010: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
e020: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
e030: 20 20 2a 2f 0a 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 57 52 49  Trans==TRANS_WRI
e050: 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
e060: 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
e070: 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
e080: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
e090: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
e0a0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
e0b0: 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
e0c0: 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
e0d0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
e0e0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e0f0: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
e100: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
e110: 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
e120: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e130: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
e140: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
e150: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
e160: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
e170: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
e180: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
e190: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
e1a0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
e1b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
e1c0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e1e0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
e1f0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
e200: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
e210: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
e220: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
e230: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
e240: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 64  _begun;.  }..  d
e250: 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  o {.    if( pBt-
e260: 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
e270: 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
e280: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 0a  ee(pBt);.    }..
e290: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e2a0: 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
e2b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
e2c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
e2d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e2e0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
e2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e310: 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
e320: 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72  ge1->pDbPage, wr
e330: 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
e340: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e350: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
e360: 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
e370: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
e380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e390: 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
e3a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e3b0: 20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42   if( wrflag ) pB
e3c0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
e3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e3e0: 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
e3f0: 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
e400: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
e410: 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
e420: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
e430: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
e440: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e450: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
e460: 72 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64  r(pBt->pBusyHand
e470: 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  ler) );..  if( r
e480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e490: 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
e4a0: 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
e4b0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
e4c0: 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20  ansaction++;.   
e4d0: 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
e4e0: 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
e4f0: 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
e500: 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
e510: 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
e520: 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
e530: 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
e540: 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
e550: 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ans;.    }.  }..
e560: 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
e570: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
e580: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
e590: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
e5a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
e5b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e5c0: 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
e5d0: 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
e5e0: 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
e5f0: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
e600: 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
e610: 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
e620: 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
e630: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
e640: 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
e650: 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
e660: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
e670: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
e680: 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
e690: 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
e6a0: 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
e6b0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
e6c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6e0: 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
e6f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
e700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e720: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
e730: 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
e740: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e770: 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
e780: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
e790: 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  Bt;.  int isInit
e7a0: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
e7b0: 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
e7c0: 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
e7d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
e7e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e7f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e800: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
e810: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
e820: 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70  (pPage, pPage->p
e830: 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
e840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e850: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
e860: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
e870: 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
e880: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
e890: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
e8a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
e8b0: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
e8c0: 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
e8d0: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
e8e0: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
e8f0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ll);.    if( rc!
e900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e910: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
e920: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
e930: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
e940: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
e950: 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
e960: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
e970: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
e980: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
e990: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
e9a0: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
e9b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
e9c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e9d0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
e9e0: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
e9f0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
ea00: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
ea10: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
ea20: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
ea30: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
ea40: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
ea50: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
ea60: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
ea70: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
ea80: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
ea90: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
eaa0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
eab0: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
eac0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ead0: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
eae0: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
eaf0: 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
eb00: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
eb10: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
eb20: 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
eb30: 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
eb40: 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
eb50: 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
eb60: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
eb70: 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
eb80: 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
eb90: 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
eba0: 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
ebb0: 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
ebc0: 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
ebd0: 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
ebe0: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
ebf0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
ec00: 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
ec10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ec20: 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
ec30: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
ec40: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
ec50: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
ec60: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
ec70: 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
ec80: 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
ec90: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
eca0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
ecb0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
ecc0: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
ecd0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
ece0: 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
ecf0: 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
ed00: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
ed10: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ed30: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
ed40: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
ed50: 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
ed60: 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
ed70: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
ed80: 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
ed90: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
eda0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
edb0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
edc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
edd0: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
ede0: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
edf0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
ee00: 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
ee10: 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
ee20: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
ee30: 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
ee40: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
ee50: 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
ee60: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
ee70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ee80: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ee90: 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
eea0: 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
eeb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
eec0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
eed0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
eee0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
eef0: 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
ef00: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ef10: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
ef20: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
ef30: 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
ef40: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
ef50: 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
ef60: 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
ef70: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
ef80: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
ef90: 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
efa0: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
efb0: 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
efc0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
efd0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
efe0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
eff0: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
f000: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
f010: 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
f020: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
f030: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
f040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
f050: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
f060: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
f070: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
f080: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
f090: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
f0c0: 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
f0d0: 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
f0e0: 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
f0f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f100: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f110: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
f120: 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
f130: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
f140: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
f150: 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
f160: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
f170: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
f180: 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
f190: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f1a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f1b0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
f1c0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
f1d0: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
f1e0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
f1f0: 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
f200: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
f210: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
f220: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f230: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
f240: 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
f250: 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
f260: 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
f270: 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
f280: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
f290: 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
f2a0: 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
f2b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f2c0: 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
f2d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
f2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
f2f0: 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
f300: 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
f310: 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
f320: 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
f330: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
f340: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
f350: 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
f360: 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
f370: 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
f380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
f390: 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
f3a0: 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
f3b0: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
f3c0: 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20  FreePage        
f3d0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
f3e0: 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
f3f0: 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ge to */.){.  Me
f400: 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
f410: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
f420: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
f430: 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
f440: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
f450: 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
f460: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
f470: 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
f480: 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
f490: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
f4a0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
f4b0: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
f4c0: 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
f4d0: 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
f4e0: 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
f4f0: 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
f500: 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
f510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f520: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
f540: 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
f550: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
f560: 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
f570: 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  t's current loca
f580: 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
f590: 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
f5a0: 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
f5b0: 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
f5c0: 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
f5d0: 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
f5e0: 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
f5f0: 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
f600: 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
f610: 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
f620: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
f630: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
f640: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
f650: 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28  FreePage);.  if(
f660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f680: 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
f690: 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
f6a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
f6b0: 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
f6c0: 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
f6d0: 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
f6e0: 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
f6f0: 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
f700: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
f710: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
f720: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
f730: 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
f740: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
f750: 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
f760: 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
f770: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
f780: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
f790: 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
f7a0: 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
f7b0: 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
f7c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
f7d0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f7e0: 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
f7f0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
f800: 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
f810: 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
f820: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
f830: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
f840: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
f850: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
f860: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
f870: 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
f880: 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
f890: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
f8a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f8b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f8c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
f8d0: 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
f8e0: 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
f8f0: 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
f900: 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
f910: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
f920: 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
f930: 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
f940: 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
f950: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
f960: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f970: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
f980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f990: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
f9a0: 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
f9b0: 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
f9c0: 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
f9d0: 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
f9e0: 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
f9f0: 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
fa00: 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
fa10: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
fa20: 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
fa30: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
fa40: 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
fa50: 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
fa60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
fa70: 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
fa80: 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
fa90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
faa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fab0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fac0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
fad0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
fae0: 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
faf0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
fb00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fb10: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
fb20: 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
fb30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
fb40: 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
fb50: 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
fb60: 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
fb70: 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
fb80: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
fb90: 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
fba0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fbb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
fbc0: 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
fbd0: 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
fbe0: 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
fbf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fc00: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
fc10: 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
fc20: 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
fc30: 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
fc40: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
fc50: 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
fc60: 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
fc70: 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
fc80: 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
fc90: 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
fca0: 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
fcb0: 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
fcc0: 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
fcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
fce0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
fcf0: 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
fd00: 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
fd10: 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
fd20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
fd30: 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
fd40: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
fd50: 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
fd60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
fd70: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
fd80: 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
fd90: 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
fda0: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
fdb0: 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
fdc0: 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
fdd0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
fde0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
fdf0: 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
fe00: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
fe10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
fe20: 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
fe30: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
fe40: 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
fe50: 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
fe60: 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
fe70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
fe80: 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
fe90: 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
fea0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
feb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
fec0: 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
fed0: 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
fee0: 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
fef0: 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
ff00: 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
ff10: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
ff20: 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50   Pgno nFin){.  P
ff30: 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20  gno iLastPg;    
ff40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
ff50: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
ff60: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
ff70: 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
ff80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ff90: 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
ffa0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
ffb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
ffc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ffd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ffe0: 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e   iLastPg = pBt->
fff0: 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c  nTrunc;.  if( iL
10000 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  astPg==0 ){.    
10010 69 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74 65  iLastPg = sqlite
10020 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10030 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10040 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
10050 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
10060 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
10070 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
10080 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
10090 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
100a0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
100b0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
100c0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
100d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
100e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
100f0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
10100 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
10110 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
10120 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10130 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
10140 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
10150 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
10160 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
10170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10180 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10190 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
101a0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
101b0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
101c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
101d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
101e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
101f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
10200 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
10210 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
10220 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
10230 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
10240 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
10250 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
10260 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
10270 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
10280 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
10290 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
102a0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
102b0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
102c0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
102d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
102e0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
102f0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
10300 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
10310 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
10320 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
10330 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
10340 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
10350 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
10360 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
10370 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
10380 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
10390 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
103a0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
103b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
103c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
103d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
103e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
103f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
10400 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
10410 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
10420 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
10430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
10440 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
10450 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
10460 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10470 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
10480 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
10490 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
104a0 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
104b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
104c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
104d0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
104e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
104f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10510 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
10520 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
10530 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
10540 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
10550 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
10560 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
10570 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
10580 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
10590 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
105a0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
105b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
105c0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
105d0 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
105e0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
105f0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
10600 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
10610 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
10620 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
10630 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
10640 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
10650 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
10660 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
10670 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
10680 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
10690 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
106a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
106b0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
106c0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
106d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
106e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
106f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
10700 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
10710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
10730 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
10740 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
10750 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
10760 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
10770 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10780 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
10790 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
107a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
107b0 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
107c0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
107d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
107e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
107f0 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20  c;.      } .    
10800 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
10810 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
10820 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
10830 65 2c 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20  e, iFreePg);.   
10840 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10850 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
10860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10870 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10880 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a  rn rc;.      } .
10890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74      }.  }..  pBt
108a0 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74  ->nTrunc = iLast
108b0 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  Pg - 1;.  while(
108c0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45   pBt->nTrunc==PE
108d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
108e0 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
108f0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54  AGE(pBt, pBt->nT
10900 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74  runc) ){.    pBt
10910 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a  ->nTrunc--;.  }.
10920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10930 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
10940 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10950 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
10960 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
10970 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
10980 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
10990 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
109a0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
109b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
109c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
109d0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
109e0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
109f0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
10a00 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
10a10 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
10a20 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
10a30 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
10a40 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
10a50 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
10a60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
10a70 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
10a80 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
10a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10aa0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
10ab0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
10ac0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
10ad0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
10ae0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10af0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
10b00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10b10 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
10b20 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
10b30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
10b40 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
10b50 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
10b60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
10b70 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
10b80 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
10b90 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
10ba0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
10bb0 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a  ep(pBt, 0);.  }.
10bc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10bd0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10c00 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
10c10 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
10c20 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
10c30 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
10c40 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
10c50 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
10c60 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
10c70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
10c80 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
10c90 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
10ca0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
10cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10cc0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
10cd0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
10ce0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
10cf0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
10d00 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
10d10 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
10d20 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
10d30 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
10d40 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
10d50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10d60 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
10d70 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
10d80 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b   Pgno *pnTrunc){
10d90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10da0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
10db0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
10dc0 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ager;.#ifndef ND
10dd0 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
10de0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
10df0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
10e00 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
10e10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10e20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10e30 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
10e40 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
10e50 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
10e60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
10e70 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
10e80 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
10e90 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
10ea0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
10eb0 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
10ec0 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
10ed0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
10ee0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
10ef0 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
10f00 53 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Size;.      Pgno
10f10 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33   nOrig = sqlite3
10f20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
10f30 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
10f40 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
10f50 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
10f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10f70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10f80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
10f90 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
10fa0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
10fb0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
10fc0 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
10fd0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
10fe0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
10ff0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11000 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
11010 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
11020 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
11030 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
11040 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
11050 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
11060 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
11070 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
11080 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
11090 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
110a0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
110b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
110c0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
110d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
110e0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
110f0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
11100 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
11110 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11120 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
11130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11140 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
11150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11160 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
11170 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
11180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11190 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
111a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
111b0 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
111c0 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
111d0 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
111e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
111f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
11200 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
11210 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11220 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
11230 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
11240 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
11250 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
11260 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
11270 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
11280 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11290 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
112a0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  .        pBt->nT
112b0 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  runc = nFin;.   
112c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
112d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
112e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
112f0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
11300 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
11310 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
11320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
11330 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54  nTrunc = pBt->nT
11340 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  runc;.    pBt->n
11350 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunc = 0;.  }. 
11360 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
11370 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
11380 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
11390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
113a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
113b0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
113c0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
113d0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
113e0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
113f0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
11400 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11410 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
11420 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
11430 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
11440 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
11450 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
11460 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
11470 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
11480 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
11490 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
114a0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
114b0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
114c0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
114d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
114e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
114f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
11500 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
11510 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
11520 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
11530 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
11540 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
11550 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
11560 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
11570 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
11580 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
11590 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
115a0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
115b0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
115c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
115d0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
115e0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
115f0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
11600 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
11610 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11620 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
11630 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
11640 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
11650 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
11660 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
11670 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
11680 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
11690 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
116a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
116b0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
116c0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
116d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
116e0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
116f0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
11700 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
11710 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
11720 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
11730 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11740 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
11750 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
11760 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
11770 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
11780 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
11790 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
117a0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
117b0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
117c0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
117d0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
117e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
117f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
11800 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
11810 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
11820 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
11830 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
11840 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
11850 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
11860 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
11870 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
11880 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
11890 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
118a0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
118b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
118c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
118d0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
118e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
118f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11900 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11910 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
11920 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
11930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11940 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
11950 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
11960 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
11970 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11980 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
11990 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nc = 0;.    sqli
119a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
119b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
119c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
119d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
119e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
119f0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
11a00 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54  mCommit(pBt, &nT
11a10 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66  runc); .      if
11a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11a30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11a40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11a50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11a60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11a70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
11a80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
11a90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
11aa0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
11ab0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
11ac0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ad0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
11ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11af0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
11b00 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
11b10 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
11b20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11b30 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
11b40 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
11b50 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
11b60 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
11b70 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
11b80 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
11b90 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
11ba0 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a  ould be invoked.
11bb0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
11bc0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
11bd0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
11be0 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
11bf0 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65  e did.** all the
11c00 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
11c10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
11c20 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
11c30 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
11c40 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
11c50 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
11c60 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
11c70 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
11c80 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
11c90 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
11ca0 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72  r truncate the r
11cb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
11cc0 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73  ** (which causes
11cd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11ce0 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20   to commit) and 
11cf0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
11d00 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
11d10 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
11d20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
11d30 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
11d40 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
11d50 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
11d60 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
11d70 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
11d80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11d90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
11da0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
11db0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11dc0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
11dd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
11de0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
11e00 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
11e10 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
11e20 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
11e30 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
11e40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
11e50 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
11e60 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
11e70 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
11e80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11e90 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
11ea0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
11eb0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
11ec0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11ed0 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
11ee0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
11ef0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
11f00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11f10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
11f20 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11f50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11f60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
11f70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
11f80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
11f90 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
11fa0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
11fb0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
11fc0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
11fd0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
11fe0 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
11ff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
12000 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
12010 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
12020 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
12030 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
12040 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12050 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
12060 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
12070 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
12080 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
12090 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
120a0 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
120b0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
120c0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
120d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
120e0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
120f0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
12100 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
12110 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
12120 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
12130 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12140 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
12150 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12160 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
12170 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
12180 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
12190 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
121a0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
121b0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
121c0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
121d0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
121e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
121f0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
12200 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
12210 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
12220 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
12230 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
12240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
12260 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12270 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
12280 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
12290 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
122a0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
122b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
122c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
122d0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
122e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
122f0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
12300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12320 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12330 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a  haseTwo(p);.  }.
12340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12350 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12360 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
12370 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
12380 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
12390 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  f write-cursors 
123a0 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e  open on this han
123b0 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72  dle. This is for
123c0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
123d0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
123e0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
123f0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
12400 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
12410 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ned..**.** For t
12420 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
12430 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77  his routine, a w
12440 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61  rite-cursor is a
12450 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
12460 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
12470 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
12480 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65  atabse.  That me
12490 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77  ans the cursor w
124a0 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79  as.** originally
124b0 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
124c0 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73  ing and the curs
124d0 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69  or has not be di
124e0 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76  sabled.** by hav
124f0 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68  ing its state ch
12500 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f  anged to CURSOR_
12510 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  FAULT..*/.static
12520 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
12530 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
12540 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
12550 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
12560 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
12570 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
12580 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
12590 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
125a0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
125b0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
125c0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
125d0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
125e0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
125f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12600 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
12610 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
12620 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
12630 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
12640 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
12650 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61   on BtShared tha
12660 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
12670 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76  rences..**.** Ev
12680 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72  ery cursor is tr
12690 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
126a0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65   cursors that be
126b0 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72  long.** to other
126c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
126d0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
126e0 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a  n to be sharing.
126f0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ** the cache wit
12700 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
12710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
12720 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
12730 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
12740 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
12750 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
12760 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69  ache must be tri
12770 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65  pped.** to preve
12780 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79  nt them from try
12790 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62  ing to use the b
127a0 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  tree after.** th
127b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  e rollback.  The
127c0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
127d0 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  ve deleted table
127e0 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f  s.** or moved ro
127f0 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20  ot pages, so it 
12800 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
12810 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65  t to.** save the
12820 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
12830 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  rsor.  The curso
12840 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  r must be.** inv
12850 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  alidated..*/.voi
12860 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d sqlite3BtreeTr
12870 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
12880 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
12890 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75  errCode){.  BtCu
128a0 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74  rsor *p;.  sqlit
128b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
128c0 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
128d0 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
128e0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
128f0 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72  t){.    clearCur
12900 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
12910 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
12920 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
12930 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
12940 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ode;.  }.  sqlit
12950 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
12960 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
12970 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
12980 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
12990 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
129a0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
129b0 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
129c0 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
129d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
129e0 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
129f0 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
12a00 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
12a10 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
12a20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
12a30 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
12a40 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
12a50 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
12a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12a70 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
12a80 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
12a90 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
12aa0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
12ab0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
12ac0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
12ad0 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
12ae0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
12af0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12b00 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
12b10 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
12b20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12b30 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
12b40 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
12b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12b60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
12b70 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
12b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
12b90 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
12ba0 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
12bb0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
12bc0 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
12bd0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
12be0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
12bf0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
12c00 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
12c10 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
12c20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
12c30 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
12c40 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
12c50 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
12c60 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
12c70 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
12c80 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
12c90 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
12ca0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
12cb0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
12cc0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
12cd0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
12ce0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
12cf0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
12d00 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
12d10 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
12d20 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
12d30 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
12d40 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
12d50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
12d60 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
12d70 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
12d80 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
12d90 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
12da0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
12db0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12dc0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
12dd0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23  .    int rc2;..#
12de0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12df0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12e00 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
12e10 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61  0;.#endif..    a
12e20 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
12e30 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
12e40 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
12e50 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
12e60 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
12e70 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
12e80 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
12e90 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
12ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
12eb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
12ec0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
12ed0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
12ee0 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
12ef0 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  ** call sqlite3B
12f00 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
12f10 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
12f20 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
12f30 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
12f40 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
12f50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
12f60 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
12f70 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
12f80 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
12f90 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
12fa0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
12fb0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
12fc0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
12fd0 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
12fe0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12ff0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
13000 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
13010 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13020 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
13030 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
13040 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
13050 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
13060 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
13070 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
13080 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
13090 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
130a0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
130b0 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    }..  p->inTran
130c0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
130d0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
130e0 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
130f0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
13100 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
13110 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
13120 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13140 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
13150 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
13160 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
13170 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
13180 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
13190 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
131a0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
131b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
131c0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
131d0 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
131e0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
131f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
13200 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
13210 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
13220 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
13230 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
13240 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
13250 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
13260 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
13270 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
13280 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
13290 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
132a0 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
132b0 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
132c0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
132d0 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
132e0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
132f0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
13300 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
13310 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
13320 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
13330 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
13340 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
13350 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
13360 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
13370 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
13380 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
13390 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
133a0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
133b0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
133c0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
133d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
133e0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
133f0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
13400 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
13410 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
13420 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
13430 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
13440 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
13450 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13460 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
13470 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13480 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
13490 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
134a0 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
134b0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
134c0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
134d0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
134e0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
134f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13500 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
13510 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
13520 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
13530 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Only ? SQLITE_OK
13540 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   : sqlite3PagerS
13550 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  tmtBegin(pBt->pP
13560 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
13570 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
13580 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13590 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
135a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
135b0 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65  ommit the statme
135c0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
135d0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
135e0 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a  rogress.  If no.
135f0 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ** subtransactio
13600 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69  n is active, thi
13610 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  s is a no-op..*/
13620 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13630 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65  eCommitStmt(Btre
13640 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13650 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13660 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
13670 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13680 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
13690 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
136a0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
136b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
136c0 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70  tmtCommit(pBt->p
136d0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
136e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
136f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  _OK;.  }.  pBt->
13700 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71  inStmt = 0;.  sq
13710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13720 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
13740 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74  ck the active st
13750 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
13760 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73  action.  If no s
13770 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  ubtransaction.**
13780 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20   is active this 
13790 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
137a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75  op..**.** All cu
137b0 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
137c0 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
137d0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
137e0 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  y attempt.** to 
137f0 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61  use a cursor tha
13800 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
13810 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
13820 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
13830 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
13840 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
13850 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
13860 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20  lbackStmt(Btree 
13870 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
13880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
13890 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
138a0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
138b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
138c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61  qlite3MallocDisa
138d0 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28 20 70 42  llow();.  if( pB
138e0 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
138f0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
13900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13910 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
13920 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
13930 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13940 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13950 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13960 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
13970 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  .  sqlite3Malloc
13980 41 6c 6c 6f 77 28 29 3b 0a 20 20 73 71 6c 69 74  Allow();.  sqlit
13990 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
139a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
139b0 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b  ./*.** Default k
139c0 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey comparison fu
139d0 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65  nction to be use
139e0 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73  d if no comparis
139f0 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  on function.** i
13a00 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  s specified on t
13a10 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
13a20 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f  ursor() call..*/
13a30 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66 6c 74  .static int dflt
13a40 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
13a50 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  *NotUsed,       
13a60 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
13a70 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64 20 2a  ta is not used *
13a80 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73  /.  int n1, cons
13a90 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f  t void *p1,    /
13aa0 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 63  * First key to c
13ab0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
13ac0 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n2, const void *
13ad0 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  p2     /* Second
13ae0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
13af0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  */.){.  int c;. 
13b00 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20   c = memcmp(p1, 
13b10 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a  p2, n1<n2 ? n1 :
13b20 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30   n2);.  if( c==0
13b30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
13b40 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
13b50 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n c;.}../*.** Cr
13b60 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
13b70 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
13b80 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
13b90 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
13ba0 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
13bb0 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
13bc0 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
13bd0 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
13be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
13bf0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
13c00 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
13c10 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
13c20 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
13c30 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
13c40 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
13c50 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
13c60 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
13c70 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
13c80 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
13c90 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
13ca0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
13cb0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
13cc0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
13cd0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
13ce0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
13cf0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
13d00 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
13d10 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
13d20 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
13d30 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
13d40 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
13d50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
13d60 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
13d70 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
13d80 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
13d90 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
13da0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
13db0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
13dc0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
13dd0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
13de0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
13df0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
13e00 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
13e10 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
13e20 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
13e30 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
13e40 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
13e50 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
13e60 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
13e70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
13e80 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
13e90 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
13ea0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
13eb0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
13ec0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
13ed0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
13ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
13ef0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
13f00 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
13f10 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
13f20 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
13f30 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
13f40 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
13f50 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
13f60 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
13f70 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
13f80 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
13f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70  ..**.** The comp
13fa0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
13fb0 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c  must be logicall
13fc0 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 65  y the same for e
13fd0 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f  very cursor.** o
13fe0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
13ff0 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e 67 20  able.  Changing 
14000 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
14010 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
14020 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72  ult.** in incorr
14030 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ect operations. 
14040 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   If the comparis
14050 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  on function is N
14060 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c  ULL, a.** defaul
14070 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  t comparison fun
14080 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ction is used.  
14090 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
140a0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c  unction is.** al
140b0 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  ways ignored for
140c0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a   INTKEY tables..
140d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
140e0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
140f0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14120 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
14130 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
14160 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
14170 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
14180 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
141b0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
141c0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70   */.  int (*xCmp
141d0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
141e0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
141f0 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79  t void*), /* Key
14200 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   Comparison func
14210 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
14220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
14250 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
14260 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43    BtCursor **ppC
14270 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14290 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
142a0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
142b0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
142c0 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61  r *pCur;.  BtSha
142d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
142e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
142f0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
14300 75 74 65 78 28 70 29 20 29 3b 0a 20 20 2a 70 70  utex(p) );.  *pp
14310 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77  Cur = 0;.  if( w
14320 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28  rFlag ){.    if(
14330 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
14340 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14350 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
14360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
14370 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
14380 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
14390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
143a0 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  E_LOCKED;.    }.
143b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e    }..  if( pBt->
143c0 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
143d0 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57   rc = lockBtreeW
143e0 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20  ithRetry(p);.   
143f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14410 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14420 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
14430 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a  ly && wrFlag ){.
14440 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14450 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
14460 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d    }.  }.  pCur =
14470 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
14480 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  ro( sizeof(*pCur
14490 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
144a0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
144b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
144c0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
144d0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
144e0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
144f0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
14500 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  le;.  if( iTable
14510 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50 61  ==1 && sqlite3Pa
14520 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14530 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
14540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14550 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
14560 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
14570 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
14580 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
14590 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
145a0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
145b0 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
145c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
145d0 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
145e0 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
145f0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
14600 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
14610 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
14620 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
14630 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
14640 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
14650 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
14660 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
14670 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
14680 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
14690 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
146a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
146b0 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
146c0 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20  xCompare = xCmp 
146d0 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d  ? xCmp : dfltCom
146e0 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41  pare;.  pCur->pA
146f0 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43 75  rg = pArg;.  pCu
14700 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
14710 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
14720 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
14730 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
14740 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
14750 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
14760 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
14770 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
14780 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
14790 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
147a0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
147b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
147c0 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75  INVALID;.  *ppCu
147d0 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74  r = pCur;..  ret
147e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
147f0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
14800 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70  ception:.  if( p
14810 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Cur ){.    relea
14820 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
14830 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
14840 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d  _free(pCur);.  }
14850 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14860 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
14870 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
14880 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
14890 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
148d0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
14910 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
14920 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14950 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
14960 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
14970 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
14980 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
14990 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
149a0 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
149b0 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
149c0 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
149f0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
14a00 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
14a10 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14a40 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
14a50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
14a60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14a70 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
14a80 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
14a90 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 78 43  able, wrFlag, xC
14aa0 6d 70 2c 20 70 41 72 67 2c 20 70 70 43 75 72 29  mp, pArg, ppCur)
14ab0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14ac0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
14ae0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
14af0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
14b00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14b10 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
14b20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
14b30 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
14b40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14b50 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
14b60 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
14b70 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
14b80 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
14b90 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
14ba0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
14bb0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
14bc0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
14bd0 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
14be0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
14bf0 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
14c00 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76  .    pCur->pPrev
14c10 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
14c20 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
14c30 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
14c40 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
14c50 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
14c60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
14c70 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
14c80 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
14c90 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
14ca0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
14cb0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
14cc0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76  used(pBt);.  inv
14cd0 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
14ce0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 73 71  ache(pCur);.  sq
14cf0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
14d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14d10 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
14d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14d30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
14d40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
14d50 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69  sor by filling i
14d60 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  n the fields of 
14d70 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65  pTempCur..** The
14d80 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
14d90 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  r is not on the 
14da0 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20  cursor list for 
14db0 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f  the Btree..*/.vo
14dc0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  id sqlite3BtreeG
14dd0 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  etTempCursor(BtC
14de0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43  ursor *pCur, BtC
14df0 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29  ursor *pTempCur)
14e00 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
14e10 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
14e20 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  r) );.  memcpy(p
14e30 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73  TempCur, pCur, s
14e40 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20  izeof(*pCur));. 
14e50 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
14e60 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
14e70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69  ->pPrev = 0;.  i
14e80 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  f( pTempCur->pPa
14e90 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ge ){.    sqlite
14ea0 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43  3PagerRef(pTempC
14eb0 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61  ur->pPage->pDbPa
14ec0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
14ed0 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
14ee0 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
14ef0 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
14f00 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
14f10 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
14f20 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
14f30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
14f40 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
14f50 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
14f60 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
14f70 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
14f80 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
14f90 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
14fa0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
14fb0 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65  nref(pCur->pPage
14fc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
14fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14fe0 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
14ff0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
15000 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
15010 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
15020 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
15030 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
15040 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
15050 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
15060 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
15070 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
15080 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
15090 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
150a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
150b0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
150c0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
150d0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
150e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
150f0 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
15100 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
15110 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
15120 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
15130 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
15140 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
15150 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
15160 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
15170 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
15180 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
15190 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
151a0 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
151b0 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
151c0 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
151d0 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
151e0 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
151f0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
15200 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
15210 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
15220 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
15230 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
15240 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
15250 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
15260 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
15270 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
15280 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
15290 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
152a0 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
152b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
152c0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
152d0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
152e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
152f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
15300 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
15310 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
15320 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
15330 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
15340 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
15350 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  ->idx, &info);. 
15360 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
15370 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
15380 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
15390 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
153a0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
153b0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
153c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
153d0 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
153e0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
153f0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
15400 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
15410 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
15420 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
15430 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
15440 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
15450 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
15460 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
15470 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15480 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
15490 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
154a0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
154b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
154c0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
154d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
154e0 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
154f0 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
15500 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
15510 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
15520 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
15530 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
15540 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
15550 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15590 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
155a0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
155e0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
155f0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
15600 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72  pCur->idx, &pCur
15610 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
15620 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
15670 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15680 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
156c0 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
156d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
156e0 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
156f0 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
15700 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
15710 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
15720 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
15730 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
15740 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
15750 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
15760 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
15770 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15780 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
15790 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
157a0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
157b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
157c0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
157d0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
157e0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
157f0 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
15800 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
15810 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
15820 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
15830 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
15840 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15850 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15860 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
15870 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
15880 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
15890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
158a0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
158b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
158c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
158d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
158e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
158f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
15900 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
15910 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  LID ){.      *pS
15920 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
15930 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
15940 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
15950 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
15960 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
15970 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15980 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
15990 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
159a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
159b0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
159c0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
159d0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
159e0 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72  ts to.  Always r
159f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
15a00 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
15a10 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66  ot possible.  If
15a20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
15a30 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ot currently.** 
15a40 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65  pointing to an e
15a50 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20  ntry (which can 
15a60 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
15a70 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64  ple, if.** the d
15a80 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
15a90 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73  ) then *pSize is
15aa0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e   set to 0..*/.in
15ab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
15ac0 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
15ad0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
15ae0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
15af0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15b00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15b10 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
15b20 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
15b30 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
15b40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15b50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
15b60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
15b70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
15b80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
15b90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
15ba0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
15bb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
15bc0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
15bd0 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
15be0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
15bf0 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
15c00 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
15c10 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
15c20 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
15c30 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
15c40 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
15c50 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
15c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
15c80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15c90 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
15ca0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
15cb0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
15cc0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
15cd0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
15ce0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
15cf0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15d00 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
15d10 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
15d20 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
15d30 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
15d40 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
15d50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
15d60 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
15d70 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
15d80 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
15d90 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
15da0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15db0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
15dc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15dd0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
15de0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e  *.** Unless pPgn
15df0 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
15e00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15e10 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
15e20 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20  low .** page in 
15e30 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
15e40 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
15e50 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
15e60 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65  e ovfl.** is the
15e70 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
15e80 27 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20  's linked list, 
15e90 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
15ea0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
15eb0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
15ec0 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65  ot NULL, *ppPage
15ed0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d   is set to the M
15ee0 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a  emPage* handle.*
15ef0 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e  * for page ovfl.
15f00 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
15f10 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68  pager page may h
15f20 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
15f30 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e  ed.** with the n
15f40 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65  oContent flag se
15f50 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64  t, so the page d
15f60 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76  ata accessable v
15f70 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  ia.** this handl
15f80 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75  e may not be tru
15f90 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
15fa0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
15fb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
15fc0 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76  *pBt, .  Pgno ov
15fd0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
15fe0 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f        /* Overflo
15ff0 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  w page */.  MemP
16000 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
16010 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16020 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
16030 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
16040 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
16050 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
16060 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
16070 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
16080 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74   next = 0;.  int
16090 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
160a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
160b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
160c0 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;.  /* One of th
160d0 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ese must not be 
160e0 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
160f0 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66   why call this f
16100 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73  unction? */.  as
16110 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70  sert(ppPage || p
16120 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a  PgnoNext);..  /*
16130 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73   If pPgnoNext is
16140 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
16150 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
16160 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  ng called to obt
16170 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61  ain.  ** a MemPa
16180 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  ge* reference on
16190 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61  ly. No page-data
161a0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
161b0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  this case..  */.
161c0 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74    if( !pPgnoNext
161d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
161e0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
161f0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70  ge(pBt, ovfl, pp
16200 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23  Page, 1);.  }..#
16210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16220 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16230 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
16240 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
16250 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
16260 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
16270 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
16280 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
16290 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
162a0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
162b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
162c0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
162d0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
162e0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
162f0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
16300 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
16310 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
16320 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
16330 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
16340 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16350 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
16360 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
16370 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
16380 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
16390 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
163a0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
163b0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
163c0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
163d0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
163e0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
163f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16400 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
16410 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
16420 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74 65  ( iGuess<=sqlite
16430 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
16440 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
16450 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
16460 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
16470 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
16480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
164b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
164c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
164d0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
164e0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
164f0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
16500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16510 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
16520 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50  ( next==0 || ppP
16530 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  age ){.    MemPa
16540 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
16550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16560 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
16570 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
16580 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73  next!=0);.    as
16590 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
165a0 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b  OK || pPage==0);
165b0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  .    if( next==0
165c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
165d0 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
165e0 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
165f0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
16600 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20  .    if( ppPage 
16610 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
16620 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65   = pPage;.    }e
16630 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  lse{.      relea
16640 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
16650 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e     }.  }.  *pPgn
16660 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20  oNext = next;.. 
16670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16680 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
16690 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
166a0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
166b0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
166c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
166d0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
166e0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
166f0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16700 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
16710 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
16720 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
16730 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
16740 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
16750 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
16760 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
16770 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
16780 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
16790 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
167a0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
167b0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
167c0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
167d0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
167e0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
167f0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
16800 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
16810 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16820 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
16830 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
16840 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
16850 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
16860 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
16870 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
16880 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
16890 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
168a0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
168b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
168c0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
168d0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
168e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
168f0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
16900 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
16910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16920 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
16930 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
16940 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
16950 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
16960 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
16970 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
16980 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
16990 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
169a0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
169b0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
169c0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
169d0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
169e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
169f0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
16a00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16a30 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
16a40 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
16a50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16a60 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
16a70 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
16a80 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
16a90 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
16aa0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
16ab0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
16ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16ae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
16af0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
16b00 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
16b10 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
16b20 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
16b30 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
16b40 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
16b50 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
16b60 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
16b70 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
16b80 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
16b90 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
16ba0 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
16bb0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
16bc0 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
16bd0 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
16be0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
16bf0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
16c00 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
16c10 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
16c20 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
16c30 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
16c40 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
16c50 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
16c60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
16c70 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
16c80 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
16c90 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
16ca0 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
16cb0 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
16cc0 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
16cd0 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
16ce0 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
16cf0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
16d00 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
16d10 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
16d20 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
16d30 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
16d40 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
16d50 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
16d60 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
16d70 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
16d80 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
16d90 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
16da0 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
16db0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
16dc0 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
16dd0 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
16de0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
16df0 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
16e00 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
16e10 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
16e20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
16e30 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
16e40 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
16e50 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
16e60 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
16e70 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
16e80 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
16e90 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
16ea0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
16eb0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
16ec0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
16ed0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
16ee0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
16ef0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
16f00 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
16f10 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
16f20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
16f30 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
16f40 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
16f50 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
16f60 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
16f70 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
16f80 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
16f90 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
16fa0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
16fb0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
16fc0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
16fd0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
16fe0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
16ff0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
17000 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
17010 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
17020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17030 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
17040 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
17050 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17060 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
17070 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
17080 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  /.  int offset, 
17090 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
170a0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
170b0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
170c0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
170d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
170e0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
170f0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
17100 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
17110 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
17120 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
17130 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
17140 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
17150 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
17160 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
17170 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17190 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
171a0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
171b0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
171c0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
171d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
171e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
171f0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
17200 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
17210 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
17220 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  age;     /* Btre
17230 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
17240 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a  t cursor entry *
17250 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
17260 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
17270 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
17280 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
17290 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
172a0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
172b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
172c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
172d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
172e0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
172f0 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
17300 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
17310 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
17320 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
17330 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
17340 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
17350 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
17360 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
17370 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
17380 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
17390 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
173a0 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72  ntKey ? 0 : pCur
173b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
173c0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
173d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
173e0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
173f0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
17400 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
17410 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
17420 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
17430 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
17440 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
17450 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
17460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17470 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  OR;.  }..  /* Ch
17480 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
17490 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
174a0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
174b0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
174c0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
174d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
174e0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
174f0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
17500 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
17510 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
17520 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
17530 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
17540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
17550 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
17560 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
17570 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
17580 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
17590 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
175a0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
175b0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
175c0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
175d0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
175e0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
175f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17600 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
17610 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a  onst int ovflSiz
17620 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
17630 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
17640 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
17650 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
17660 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
17670 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
17680 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
17690 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
176a0 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
176b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
176c0 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
176d0 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
176e0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
176f0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
17700 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
17710 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
17720 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
17730 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
17740 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
17750 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
17760 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
17770 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
17780 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
17790 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
177a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
177b0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
177c0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
177d0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
177e0 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
177f0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
17800 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
17810 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
17820 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
17830 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
17840 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
17850 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
17860 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
17870 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
17880 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
17890 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
178a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
178b0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
178c0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
178d0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
178e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
178f0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
17900 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
17910 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
17920 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
17930 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
17940 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
17950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
17960 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
17970 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
17980 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17990 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
179a0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
179b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
179c0 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
179d0 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
179e0 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
179f0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
17a00 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
17a10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
17a20 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
17a30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
17a40 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
17a50 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
17a60 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
17a70 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
17a80 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
17a90 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
17aa0 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
17ab0 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
17ac0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
17ad0 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
17ae0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
17af0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
17b00 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
17b10 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
17b20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
17b30 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
17b40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17b50 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
17b60 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
17b70 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
17b80 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
17b90 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
17ba0 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
17bb0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
17bc0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
17bd0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
17be0 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
17bf0 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
17c00 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
17c10 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
17c20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
17c30 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
17c40 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
17c50 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
17c60 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
17c70 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
17c80 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
17c90 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
17ca0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
17cb0 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
17cc0 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
17cd0 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
17ce0 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
17cf0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
17d00 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
17d10 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
17d20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
17d30 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
17d40 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
17d50 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
17d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
17d70 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
17d80 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
17d90 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
17da0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
17db0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
17dc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
17dd0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
17de0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
17df0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
17e00 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
17e10 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
17e20 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
17e30 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
17e40 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
17e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17e60 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
17e70 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
17e80 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
17e90 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
17ea0 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
17eb0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
17ec0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
17ed0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
17ee0 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
17ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
17f00 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
17f10 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
17f20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17f30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17f40 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
17f50 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
17f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
17f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f80 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
17f90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
17fa0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
17fb0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
17fc0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
17fd0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
17fe0 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
17ff0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
18000 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
18010 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
18020 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
18030 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
18040 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
18050 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
18060 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
18070 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18080 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18090 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
180a0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
180b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
180c0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
180d0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
180e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
180f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18110 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
18120 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18130 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
18140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18150 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
18160 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
18170 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
18180 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
18190 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
181a0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
181b0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
181c0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
181d0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
181e0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
181f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
18200 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
18210 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
18220 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
18230 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
18240 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
18250 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
18260 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
18270 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
18280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18290 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
182a0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
182b0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
182c0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
182d0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
182e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
182f0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
18300 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
18310 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
18320 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
18340 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18350 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18370 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
18380 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18390 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
183a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
183b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
183c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
183d0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
183e0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
183f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18400 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18410 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
18420 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
18430 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
18440 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
18450 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
18460 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
18470 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18480 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
18490 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
184a0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
184b0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
184c0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
184d0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
184e0 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
184f0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
18500 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
18510 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
18520 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18530 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
18540 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
18550 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18560 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
18570 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18580 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
18590 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
185a0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
185b0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
185c0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
185d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
185e0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
185f0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
18600 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
18610 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18620 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18630 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
18640 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
18650 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
18660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18670 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18680 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18690 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
186a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
186b0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
186c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
186d0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
186e0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
186f0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
18700 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
18710 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
18720 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20  , pBuf, 1, 0);. 
18730 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18740 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18750 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
18760 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
18770 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
18780 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
18790 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
187a0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
187b0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
187c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
187d0 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
187e0 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
187f0 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
18800 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
18810 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
18820 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
18830 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
18840 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
18850 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
18860 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
18870 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
18880 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
18890 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
188a0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
188b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
188c0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
188d0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
188e0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
188f0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
18900 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
18910 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
18920 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
18930 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
18940 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
18950 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
18960 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
18970 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
18980 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
18990 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
189a0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
189b0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
189c0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
189d0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
189e0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
189f0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
18a00 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b  ssembly.** the k
18a10 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
18a20 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
18a30 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
18a40 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
18a50 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
18a60 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
18a70 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
18a80 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
18a90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18aa0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
18ab0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
18ac0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
18ad0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
18ae0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
18af0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
18b00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
18b10 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
18b20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
18b30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
18b40 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
18b50 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
18b60 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
18b70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18b80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
18b90 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
18ba0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
18bb0 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
18bc0 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
18bd0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
18be0 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
18bf0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
18c00 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
18c10 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
18c20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63  nKey;.  int nLoc
18c30 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
18c40 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
18c50 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
18c60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18c70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
18c90 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
18ca0 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
18cb0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
18cc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18cd0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18ce0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
18cf0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
18d00 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
18d10 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
18d20 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61  pCell;.  aPayloa
18d30 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  d += pCur->info.
18d40 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
18d50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18d60 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
18d70 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
18d80 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
18d90 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69  y;.  }.  if( ski
18da0 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79  pKey ){.    aPay
18db0 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
18dc0 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
18dd0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e  >info.nLocal - n
18de0 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Key;.  }else{.  
18df0 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
18e00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
18e10 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65    if( nLocal>nKe
18e20 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61  y ){.      nLoca
18e30 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  l = nKey;.    }.
18e40 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
18e50 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
18e60 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
18e70 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
18e80 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
18e90 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
18ea0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
18eb0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
18ec0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
18ed0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
18ee0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
18ef0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
18f00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
18f10 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
18f20 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
18f30 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
18f40 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
18f50 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
18f60 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
18f70 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
18f80 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
18f90 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
18fa0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
18fb0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
18fc0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
18fd0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
18fe0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
18ff0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
19000 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
19010 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
19020 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
19030 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
19040 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
19050 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
19060 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
19070 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
19080 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
19090 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
190a0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
190b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
190c0 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
190d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
190e0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61   int *pAmt){.  a
190f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19100 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19110 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19120 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19130 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
19140 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
19150 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
19160 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
19170 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
19180 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
19190 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
191a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
191b0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
191c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
191d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
191e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
191f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19200 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
19210 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
19220 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
19230 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
19240 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
19250 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19260 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
19270 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
19280 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
19290 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
192a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
192b0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
192c0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
192d0 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
192e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
192f0 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
19300 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
19310 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65   *pNewPage;.  Me
19320 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b  mPage *pOldPage;
19330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19340 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
19350 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19360 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19380 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19390 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
193a0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
193b0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
193c0 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e  pNewPage, pCur->
193d0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
193e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
193f0 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72  pNewPage->idxPar
19400 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  ent = pCur->idx;
19410 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43  .  pOldPage = pC
19420 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c  ur->pPage;.  pOl
19430 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  dPage->idxShift 
19440 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
19450 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20  ge(pOldPage);.  
19460 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e  pCur->pPage = pN
19470 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
19480 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19490 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
194a0 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
194b0 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
194c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
194d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
194e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
194f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
19500 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19510 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74  page is the virt
19520 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  ual root of its 
19530 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
19540 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19550 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
19560 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62  age for most tab
19570 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72  les.  But.** for
19580 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
19590 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d  d on page 1, som
195a0 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72  etime the real r
195b0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65  oot page.** is e
195c0 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20  mpty except for 
195d0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
195e0 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  r.  In such case
195f0 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  s the.** virtual
19600 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19610 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
19620 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
19630 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f   page.** 1 is po
19640 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
19650 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
19660 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65  RootPage(MemPage
19670 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
19680 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20  age *pParent;.. 
19690 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
196a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
196b0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
196c0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
196d0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
196e0 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
196f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
19700 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31   pParent->pgno>1
19710 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19720 66 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61  f( get2byte(&pPa
19730 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
19740 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  ent->hdrOffset+3
19750 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
19760 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
19770 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19780 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
19790 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
197a0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
197b0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
197c0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
197d0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
197e0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
197f0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19800 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
19810 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
19820 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
19830 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
19840 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19850 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
19860 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
19870 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
19880 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
19890 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
198a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
198b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
198c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
198d0 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
198e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
198f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19900 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19910 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19920 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19930 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
19940 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
19950 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
19960 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42  ssert( !sqlite3B
19970 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
19980 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19990 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
199a0 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
199b0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
199c0 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
199d0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
199e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
199f0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19a00 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19a10 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
19a20 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
19a30 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19a40 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
19a50 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
19a60 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
19a70 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
19a80 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
19a90 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
19aa0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
19ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19ac0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
19ad0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
19ae0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
19af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19b00 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
19b10 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
19b20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19b30 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
19b40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19b50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19b60 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
19b70 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
19b80 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
19b90 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
19ba0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
19bb0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
19bc0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
19bd0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
19be0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
19bf0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
19c00 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
19c10 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
19c20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19c30 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
19c40 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
19c50 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  skip;.    }.    
19c60 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
19c70 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ion(pCur);.  }. 
19c80 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
19c90 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
19ca0 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  t && pRoot->pgno
19cb0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
19cc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19cd0 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b  pRoot->isInit );
19ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
19cf0 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
19d00 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
19d10 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
19d20 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
19d30 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b  Root, 0)).    ){
19d40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
19d50 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
19d60 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
19d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19d80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
19d90 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
19da0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f  Cur->pPage = pRo
19db0 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ot;.  }.  pCur->
19dc0 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19dd0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
19de0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
19df0 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
19e00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
19e10 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
19e20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
19e30 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
19e40 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
19e50 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
19e60 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
19e70 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
19e80 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
19e90 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
19ea0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
19eb0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
19ec0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
19ed0 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
19ee0 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
19ef0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
19f00 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
19f10 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
19f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19f30 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19f40 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
19f50 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
19f60 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19f70 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
19f80 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
19f90 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
19fa0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
19fb0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
19fc0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
19fd0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
19fe0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
19ff0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a000 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1a010 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1a020 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a030 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1a040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1a050 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a060 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a070 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a0a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a0b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a0c0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a0d0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a0e0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1a0f0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1a100 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1a110 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1a120 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1a130 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1a140 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1a150 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a160 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a180 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a190 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a1a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
1a1b0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a1c0 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
1a1d0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a1e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a1f0 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
1a200 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
1a210 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
1a220 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
1a230 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
1a240 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
1a250 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
1a260 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a270 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
1a280 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
1a290 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1a2a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1a2b0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a2c0 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
1a2d0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
1a2e0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
1a2f0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1a300 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
1a310 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
1a320 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a330 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1a340 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
1a350 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1a360 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1a370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1a380 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1a390 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a3a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a3b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a3c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a3d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1a3e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1a3f0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1a400 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1a410 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1a420 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1a430 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1a440 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1a450 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1a460 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1a470 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a480 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a490 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1a4a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1a4b0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1a4c0 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70  nCell - 1;.    p
1a4d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a4e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a4f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a500 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a510 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
1a520 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a530 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a540 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a550 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a560 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a570 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a580 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a590 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a5a0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a5b0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a5c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
1a5d0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
1a5e0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1a5f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a600 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a610 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a630 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1a640 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
1a650 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
1a660 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1a670 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1a680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a690 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a6a0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1a6b0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
1a6c0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1a6d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1a6e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1a6f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a700 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1a710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1a720 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
1a730 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1a740 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1a750 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1a760 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1a770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a780 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1a790 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1a7a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a7b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a7c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a7d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a7e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a7f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a800 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a810 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a820 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a830 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a840 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1a850 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1a860 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1a870 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1a880 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a890 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a8a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a8b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1a8c0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
1a8d0 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
1a8e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1a8f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1a900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a910 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1a920 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1a930 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1a940 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1a950 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1a960 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1a970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1a980 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a990 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a9a0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
1a9b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1a9c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1a9d0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1a9e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a9f0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1aa00 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1aa10 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1aa20 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65  ry near pKey/nKe
1aa30 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
1aa40 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1aa50 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1aa60 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1aa70 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1aa80 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
1aa90 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
1aaa0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e   other tables, n
1aab0 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Key is the numbe
1aac0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1aad0 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20  ta.** in pKey.  
1aae0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
1aaf0 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  unction specifie
1ab00 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  d when the curso
1ab10 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64  r was.** created
1ab20 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
1ab30 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  are keys..**.** 
1ab40 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1ab50 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1ab60 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1ab70 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1ab80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1ab90 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1aba0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1abb0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1abc0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1abd0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1abe0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1abf0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1ac00 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1ac10 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1ac20 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1ac30 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1ac40 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1ac50 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1ac60 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1ac70 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1ac80 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1ac90 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1aca0 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1acb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1acc0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1acd0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1ace0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1acf0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1ad00 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1ad10 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1ad20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1ad30 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1ad50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1ad60 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1ad70 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1ad80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1ad90 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1ada0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1adb0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1adc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1add0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1ade0 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1adf0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1ae00 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1ae10 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1ae20 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1ae30 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1ae40 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1ae50 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f  than pKey..**.*/
1ae60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ae70 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
1ae80 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1ae90 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1aea0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1aeb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1aec0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  y,      /* The k
1aed0 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69  ey content for i
1aee0 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65  ndices.  Not use
1aef0 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  d by tables */. 
1af00 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
1af10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1af20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65  of pKey.  Or the
1af30 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20   key for tables 
1af40 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
1af50 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ht,         /* I
1af60 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
1af70 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
1af80 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
1af90 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
1afa0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65      /* Search re
1afb0 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a  sult flag */.){.
1afc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1afd0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1afe0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1aff0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b000 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1b010 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
1b020 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  e->mutex) );.  r
1b030 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b040 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1b050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1b060 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b070 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1b080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b090 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b0a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b0b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b0c0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
1b0d0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
1b0e0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b0f0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1b100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b110 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b120 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b130 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b140 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b150 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b160 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b170 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b180 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b190 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1b1a0 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1b1b0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1b1c0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1b1d0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1b1e0 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  y && pKey==0 ){.
1b1f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b220 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
1b230 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75     pCur->idx = u
1b240 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
1b250 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1b260 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20   (upr+lwr)/2;.  
1b270 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c    }.    if( lwr<
1b280 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a  =upr ) for(;;){.
1b290 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
1b2a0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
1b2b0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1b2c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b2d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b2e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1b2f0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1b300 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
1b310 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1b320 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b  ge, pCur->idx) +
1b330 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
1b340 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1b350 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1b360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
1b370 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
1b380 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
1b390 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26  arint32(pCell, &
1b3a0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1b3b0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1b3c0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20  int(pCell, (u64 
1b3d0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1b3e0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1b3f0 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey<nKey ){.     
1b400 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1b410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1b420 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a  CellKey>nKey ){.
1b430 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
1b440 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1b450 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
1b460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b480 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a   int available;.
1b490 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1b4a0 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68   = (void *)fetch
1b4b0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61  Payload(pCur, &a
1b4c0 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20  vailable, 0);.  
1b4d0 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d        nCellKey =
1b4e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1b4f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
1b500 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
1b510 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1b520 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1b530 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1b540 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1b550 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1b560 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b570 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1b580 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1b590 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  c( nCellKey );. 
1b5a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1b5b0 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  llKey==0 ) retur
1b5c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b5d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b5e0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1b5f0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1b600 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1b610 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1b620 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1b630 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1b640 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1b650 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1b660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b670 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
1b680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b690 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1b6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b6c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b6d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1b6e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1b6f0 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
1b700 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1b710 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1b720 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  >idx;.          
1b730 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1b740 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b760 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
1b770 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  s ) *pRes = 0;. 
1b780 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1b7a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b7b0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
1b7c0 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1b7d0 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  ->idx+1;.      }
1b7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
1b7f0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b  r = pCur->idx-1;
1b800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b810 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
1b820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b830 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
1b840 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29  >idx = (lwr+upr)
1b850 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  /2;.    }.    as
1b860 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
1b870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b880 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1b890 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1b8a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
1b8b0 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ldPg = 0;.    }e
1b8c0 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61  lse if( lwr>=pPa
1b8d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1b8e0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1b8f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b900 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b910 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
1b920 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
1b930 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1b940 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
1b950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b960 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20   chldPg==0 ){.  
1b970 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b980 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1b990 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
1b9a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1b9b0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1b9c0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65  es = c;.      re
1b9d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b9e0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1b9f0 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70  idx = lwr;.    p
1ba00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ba10 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1ba20 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1ba30 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1ba40 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1ba50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ba60 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48  }.  /* NOT REACH
1ba70 45 44 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ED */.}.../*.** 
1ba80 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1ba90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1baa0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1bab0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1bac0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1bad0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1bae0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1baf0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1bb00 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1bb10 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1bb20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1bb30 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1bb40 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1bb50 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1bb60 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1bb70 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1bb80 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1bb90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1bba0 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1bbb0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1bbc0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1bbd0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1bbe0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1bbf0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1bc00 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1bc10 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1bc20 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1bc30 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1bc40 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1bc50 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1bc60 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1bc70 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1bc80 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1bc90 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1bca0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1bcb0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1bcc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bcd0 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72  handle for a cur
1bce0 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  sor..*/.sqlite3 
1bcf0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  *sqlite3BtreeCur
1bd00 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75  sorDb(const BtCu
1bd10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1bd20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1bd30 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1bd40 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d  pBtree->pSqlite-
1bd50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1bd60 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1bd70 2d 3e 70 53 71 6c 69 74 65 3b 0a 7d 0a 0a 2f 2a  ->pSqlite;.}../*
1bd80 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
1bd90 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
1bda0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
1bdb0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1bdc0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1bdd0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1bde0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1bdf0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1be00 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
1be10 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1be20 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1be30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1be40 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1be50 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73  et *pRes=1..*/.s
1be60 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4e  tatic int btreeN
1be70 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1be80 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1be90 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1bea0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1beb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bec0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bed0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1bee0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1bef0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1bf00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bf10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1bf20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bf30 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
1bf40 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1bf50 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1bf60 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1bf70 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1bf80 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1bf90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1bfa0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1bfb0 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1bfc0 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1bfd0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1bfe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bff0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1c000 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1c010 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1c020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c030 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1c040 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1c050 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1c060 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1c070 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  if( pCur->idx>=p
1c080 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1c090 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1c0a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1c0b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c0c0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
1c0d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c0e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
1c0f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1c100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c110 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1c120 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1c130 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c150 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
1c160 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
1c170 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1c180 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1c190 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1c1a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1c1b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1c1c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c1e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1c1f0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1c200 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1c210 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1c220 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  age;.    }while(
1c230 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67   pCur->idx>=pPag
1c240 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1c250 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
1c260 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1c270 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ta ){.      rc =
1c280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1c290 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
1c2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c2c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1c2d0 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
1c2e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1c2f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
1c300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c310 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
1c320 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1c330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c340 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c350 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
1c360 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1c370 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
1c380 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c390 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c3a0 20 20 72 63 20 3d 20 62 74 72 65 65 4e 65 78 74    rc = btreeNext
1c3b0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1c3c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c3d0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
1c3e0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
1c3f0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
1c400 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1c410 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1c420 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1c430 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1c440 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1c450 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1c460 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
1c470 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1c480 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1c490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c4a0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1c4b0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74  t *pRes=1..*/.st
1c4c0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 72  atic int btreePr
1c4d0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1c4e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c4f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
1c500 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50  gno pgno;.  MemP
1c510 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1c520 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1c530 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1c540 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1c550 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1c560 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1c590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53  ;.  }.  if( CURS
1c5a0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1c5b0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1c5c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1c5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c5e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1c5f0 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1c600 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1c610 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c630 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1c640 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1c650 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1c660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1c670 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1c680 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c690 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
1c6a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1c6b0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1c6c0 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
1c6d0 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
1c6e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1c6f0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1c700 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1c710 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c720 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1c730 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1c740 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1c750 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
1c760 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >idx==0 ){.     
1c770 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1c780 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1c790 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
1c7a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c7b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1c7c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1c7d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c7f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1c800 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1c810 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1c820 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1c830 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  e;.    }.    pCu
1c840 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43  r->idx--;.    pC
1c850 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1c860 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1c870 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21  e->leafData && !
1c880 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c8a0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1c8b0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1c8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c8d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c8e0 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
1c8f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1c900 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
1c910 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
1c920 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1c930 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1c940 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1c950 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c960 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r) );.  rc = btr
1c970 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
1c980 20 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   pRes);.  return
1c990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
1c9a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
1c9b0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
1c9c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c9d0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
1c9e0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1c9f0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
1ca00 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
1ca10 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
1ca20 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
1ca30 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
1ca40 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
1ca50 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
1ca60 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
1ca70 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
1ca80 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
1ca90 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1caa0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1cab0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
1cac0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
1cad0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
1cae0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1caf0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
1cb00 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
1cb10 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
1cb20 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
1cb30 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
1cb40 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
1cb50 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1cb60 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
1cb70 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
1cb80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1cb90 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
1cba0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1cbb0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
1cbc0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
1cbd0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
1cbe0 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
1cbf0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
1cc00 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
1cc10 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
1cc20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
1cc30 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
1cc40 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
1cc50 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
1cc60 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
1cc70 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
1cc80 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
1cc90 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
1cca0 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
1ccb0 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
1ccc0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
1ccd0 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
1cce0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1ccf0 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
1cd00 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
1cd10 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
1cd20 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
1cd30 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
1cd40 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
1cd50 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
1cd60 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
1cd70 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
1cd80 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
1cd90 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
1cda0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1cdb0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1cdc0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1cdd0 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
1cde0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
1cdf0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
1ce00 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
1ce10 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
1ce20 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
1ce30 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b  int rc;.  int n;
1ce40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ce50 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1ce60 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  reelist */.  int
1ce70 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
1ce80 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
1ce90 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
1cea0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
1ceb0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
1cec0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1ced0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20  revTrunk = 0;.. 
1cee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cef0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1cf00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
1cf10 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1cf20 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  1;.  n = get4byt
1cf30 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1cf40 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30  [36]);.  if( n>0
1cf50 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
1cf60 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
1cf70 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
1cf80 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
1cf90 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
1cfa0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
1cfb0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
1cfc0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
1cfd0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
1cfe0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
1cff0 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
1d000 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
1d010 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
1d020 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
1d030 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
1d040 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
1d050 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
1d060 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
1d070 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1d080 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
1d090 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
1d0a0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
1d0b0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
1d0c0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
1d0d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d0e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1d0f0 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
1d100 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  <=sqlite3PagerPa
1d110 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1d120 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38  ger) ){.      u8
1d130 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
1d140 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
1d150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d160 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1d170 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
1d180 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
1d190 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
1d1a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1d1b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d1c0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d1d0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1d1e0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1d1f0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
1d200 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
1d210 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
1d220 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
1d230 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
1d240 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
1d250 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
1d260 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
1d270 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
1d280 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
1d290 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
1d2a0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
1d2b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1d2c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1d2d0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1d2e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1d2f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
1d300 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d310 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
1d320 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
1d330 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
1d340 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
1d350 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
1d360 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
1d370 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
1d380 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
1d390 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
1d3a0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
1d3b0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
1d3c0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
1d3d0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
1d3e0 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
1d3f0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
1d400 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
1d410 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
1d420 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1d430 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1d440 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
1d450 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
1d460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d470 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
1d480 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1d490 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
1d4a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1d4b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1d4c0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
1d4d0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
1d4e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d4f0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1d500 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1d510 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1d520 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d530 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1d540 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
1d550 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
1d560 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
1d570 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1d580 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
1d590 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
1d5a0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
1d5b0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
1d5c0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
1d5d0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
1d5e0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
1d5f0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
1d600 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
1d610 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
1d620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
1d630 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
1d640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d650 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1d660 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1d670 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d680 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1d690 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1d6a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d6b0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
1d6c0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
1d6d0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1d6e0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1d6f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1d700 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1d710 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1d720 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1d730 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1d740 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1d750 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1d760 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1d770 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
1d780 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75  lse if( k>pBt->u
1d790 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
1d7a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
1d7b0 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
1d7c0 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
1d7d0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
1d7e0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
1d7f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d800 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
1d810 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d820 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
1d830 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d840 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
1d850 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26  f( searchList &&
1d860 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20   nearby==iTrunk 
1d870 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1d880 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
1d890 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
1d8a0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
1d8b0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
1d8c0 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
1d8d0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
1d8e0 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
1d8f0 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
1d900 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d910 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20   *pPgno==iTrunk 
1d920 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
1d930 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
1d940 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1d950 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
1d960 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d970 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1d980 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1d990 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d9a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1d9b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1d9c0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d9d0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1d9e0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1d9f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1da00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1da10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1da20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1da30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1da40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1da50 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
1da60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1da70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1da80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1da90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1daa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dab0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
1dac0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
1dad0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
1dae0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
1daf0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
1db00 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
1db10 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
1db20 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
1db30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
1db40 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1db50 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1db60 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1db70 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
1db80 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
1db90 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1dba0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
1dbb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
1dbc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1dbd0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
1dbe0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
1dbf0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
1dc00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dc10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dc20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1dc30 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1dc40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dc50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1dc60 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
1dc70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1dc80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dc90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dca0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1dcb0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1dcc0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1dcd0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1dce0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1dcf0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1dd00 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1dd10 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1dd20 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1dd30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1dd40 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1dd50 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1dd60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
1dd70 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
1dd80 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1dd90 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
1dda0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1ddb0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
1ddc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ddd0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1ddf0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1de00 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
1de10 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
1de20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1de30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de40 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
1de50 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1de60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1de70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1de80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1de90 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1dea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1deb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1dec0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1ded0 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
1dee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1def0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1df00 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1df10 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1df20 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1df30 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1df40 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1df50 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
1df60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df70 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
1df80 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
1df90 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  nk */.        in
1dfa0 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  t closest;.     
1dfb0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
1dfc0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
1dfd0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
1dfe0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
1dff0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e000 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1e010 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1e020 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e030 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1e040 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e060 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
1e070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1e080 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20  t i, dist;.     
1e090 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
1e0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
1e0b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1e0c0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
1e0e0 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
1e0f0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1e100 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
1e110 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1e120 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
1e130 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
1e140 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1e150 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
1e160 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
1e170 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
1e180 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
1e190 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
1e1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e1b0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
1e1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e1d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e1e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
1e1f0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
1e200 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
1e210 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1e220 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
1e230 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
1e240 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
1e250 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
1e260 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
1e270 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
1e280 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
1e290 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1e2a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e2b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1e2c0 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
1e2d0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
1e2e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
1e2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e300 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e310 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e320 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1e330 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
1e340 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
1e350 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
1e370 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
1e380 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
1e390 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
1e3a0 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
1e3b0 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
1e3c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1e3d0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1e3f0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
1e400 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
1e410 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
1e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e430 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
1e440 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1e450 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e460 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1e470 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1e480 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 1);.         
1e490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e4a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e4b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
1e4c0 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50  ntRollback((*ppP
1e4d0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1e4f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e500 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1e510 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e540 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1e550 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1e560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e580 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1e590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e5a0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
1e5b0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1e5c0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
1e5d0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
1e5e0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
1e5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e600 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
1e610 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1e620 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
1e630 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
1e640 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
1e650 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1e660 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33  *pPgno = sqlite3
1e670 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1e680 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b  Bt->pPager) + 1;
1e690 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e6a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e6b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
1e6c0 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  runc ){.      /*
1e6d0 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20   An incr-vacuum 
1e6e0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
1e6f0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
1e700 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a  saction. So the.
1e710 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f        ** page to
1e720 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74   allocate is not
1e730 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63   from the physic
1e740 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  al end of the fi
1e750 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  le, but.      **
1e760 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e   at pBt->nTrunc.
1e770 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1e780 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
1e790 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69  Trunc+1;.      i
1e7a0 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
1e7b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70  ) ){.        (*p
1e7d0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d  Pgno)++;.      }
1e7e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e7f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
1e800 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
1e810 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a  pBt, *pPgno) ){.
1e820 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
1e830 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
1e840 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1e850 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
1e860 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
1e870 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1e880 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
1e890 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
1e8a0 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
1e8b0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
1e8c0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
1e8d0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
1e8e0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
1e8f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
1e900 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45    */.      TRACE
1e910 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1e920 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1e930 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
1e940 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ge)\n", *pPgno))
1e950 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e960 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1e970 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e980 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
1e990 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
1e9a0 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b  ( pBt->nTrunc ){
1e9b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  .      pBt->nTru
1e9c0 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20  nc = *pPgno;.   
1e9d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
1e9e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1e9f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ea00 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
1ea10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1ea20 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
1ea30 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
1ea40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ea50 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1ea60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ea70 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1ea80 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ea90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1eaa0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1eab0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1eac0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
1ead0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1eae0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
1eaf0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
1eb00 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1eb10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1eb20 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
1eb30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
1eb40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1eb50 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
1eb60 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1eb70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1eb80 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67  ./*.** Add a pag
1eb90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1eba0 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72  e file to the fr
1ebb0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71  eelist..**.** sq
1ebc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ebd0 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20  ) is NOT called 
1ebe0 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
1ebf0 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
1ec00 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1ec10 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1ec20 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1ec30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1ec40 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1ec50 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b  ;.  int rc, n, k
1ec60 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20  ;..  /* Prepare 
1ec70 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65  the page for fre
1ec80 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  eing */.  assert
1ec90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1eca0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1ecb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ecc0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
1ecd0 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  >1 );.  pPage->i
1ece0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c  sInit = 0;.  rel
1ecf0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e  easePage(pPage->
1ed00 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67  pParent);.  pPag
1ed10 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
1ed20 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1ed30 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
1ed40 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
1ed50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1ed60 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1ed70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1ed80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ed90 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1eda0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1edb0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
1edc0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1edd0 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64  36], n+1);..#ifd
1ede0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
1edf0 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20  _DELETE.  /* If 
1ee00 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52  the SQLITE_SECUR
1ee10 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65  E_DELETE compile
1ee20 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
1ee30 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
1ee40 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
1ee50 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
1ee60 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
1ee70 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20  th zeros..  */. 
1ee80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ee90 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
1eea0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1eeb0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1eec0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
1eed0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
1eee0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
1eef0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1ef00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ef10 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74  VACUUM.  /* If t
1ef20 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
1ef30 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
1ef40 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
1ef50 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
1ef60 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
1ef70 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
1ef80 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
1ef90 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1efa0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1efb0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
1efc0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50  , pPage->pgno, P
1efd0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
1efe0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1eff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f000 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d  #endif..  if( n=
1f010 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1f020 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1f030 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ree page */.    
1f040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f050 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1f060 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f070 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f080 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1f090 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a  ->aData, 0, 8);.
1f0a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1f0b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1f0c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1f0d0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
1f0e0 50 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e  PAGE: %d first\n
1f0f0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
1f100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1f110 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67  * Other free pag
1f120 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  es already exist
1f130 2e 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66  .  Retrive the f
1f140 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  irst trunk page.
1f150 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72      ** of the fr
1f160 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20  eelist and find 
1f170 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61  out how many lea
1f180 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20  ves it has. */. 
1f190 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75     MemPage *pTru
1f1a0 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  nk;.    rc = sql
1f1b0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1f1c0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
1f1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f1e0 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  ]), &pTrunk, 0);
1f1f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d  turn rc;.    k =
1f210 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1f220 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
1f230 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73    if( k>=pBt->us
1f240 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1f250 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  {.      /* The t
1f260 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54  runk is full.  T
1f270 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69  urn the page bei
1f280 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20  ng freed into a 
1f290 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75  new.      ** tru
1f2a0 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20  nk page with no 
1f2b0 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20  leaves. */.     
1f2c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f2d0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
1f2e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
1f2f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f300 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  c;.      put4byt
1f310 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1f320 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20  pTrunk->pgno);. 
1f330 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f340 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
1f350 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1f360 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f370 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
1f380 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  no);.      TRACE
1f390 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1f3a0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
1f3b0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
1f3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1f3d0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75  Page->pgno, pTru
1f3e0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1f3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1f400 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72  Add the newly fr
1f410 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65  eed page as a le
1f420 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  af on the curren
1f430 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  t trunk */.     
1f440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f450 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1f460 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1f470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f480 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
1f490 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1f4a0 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20  Data[4], k+1);. 
1f4b0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f4c0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
1f4d0 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67  +k*4], pPage->pg
1f4e0 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
1f4f0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1f500 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  E.        sqlite
1f510 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1f520 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f530 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
1f540 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
1f550 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
1f560 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
1f570 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
1f580 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
1f590 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
1f5a0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
1f5b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f5c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
1f5d0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
1f5e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1f5f0 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
1f600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f610 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
1f620 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
1f630 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
1f640 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f650 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1f660 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1f670 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
1f680 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1f690 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76   nOvfl;.  int ov
1f6a0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
1f6b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f6c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1f6d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1f6e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
1f6f0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
1f700 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1f710 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
1f720 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
1f730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f740 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
1f750 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
1f760 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1f770 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
1f780 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
1f790 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
1f7a0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f  iOverflow]);.  o
1f7b0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
1f7c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1f7d0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
1f7e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
1f7f0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
1f800 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
1f810 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
1f820 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
1f830 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
1f840 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
1f850 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
1f860 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20  *pOvfl;.    if( 
1f870 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f  ovflPgno==0 || o
1f880 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50  vflPgno>sqlite3P
1f890 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1f8a0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1f8b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f8c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f8d0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1f8e0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1f8f0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
1f900 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30  pOvfl, (nOvfl==0
1f910 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a  )?0:&ovflPgno);.
1f920 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f930 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1f940 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29   freePage(pOvfl)
1f950 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1f960 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
1f970 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1f980 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f990 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f9a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f9b0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
1f9c0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
1f9d0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
1f9e0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
1f9f0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
1fa00 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
1fa10 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
1fa20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
1fa30 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
1fa40 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
1fa50 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
1fa60 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
1fa70 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
1fa80 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
1fa90 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
1faa0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
1fab0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
1fac0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
1fad0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
1fae0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
1faf0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
1fb00 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
1fb10 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
1fb20 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
1fb30 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
1fb40 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
1fb50 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
1fb60 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
1fb70 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
1fb80 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
1fb90 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
1fba0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
1fbb0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
1fbc0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
1fbd0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
1fbe0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1fbf0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1fc00 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
1fc10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
1fc20 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
1fc30 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
1fc40 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
1fc50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1fc60 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
1fc70 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
1fc80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
1fc90 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
1fca0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
1fcb0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fcd0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
1fce0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
1fcf0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
1fd00 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
1fd10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1fd20 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
1fd30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
1fd40 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
1fd50 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
1fd60 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
1fd70 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
1fd80 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
1fd90 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
1fda0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
1fdb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1fdc0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
1fdd0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
1fde0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1fdf0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1fe00 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
1fe10 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
1fe20 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
1fe30 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
1fe40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1fe50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1fe60 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  utex) );..  /* F
1fe70 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
1fe80 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
1fe90 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
1fea0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
1feb0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
1fec0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
1fed0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
1fee0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
1fef0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
1ff00 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
1ff10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
1ff20 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
1ff30 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
1ff40 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
1ff50 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
1ff60 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71  64*)&nKey);.  sq
1ff70 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1ff80 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1ff90 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
1ffa0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
1ffb0 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
1ffc0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1ffd0 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
1ffe0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
1fff0 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29  a==nData+nZero )
20000 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
20010 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
20020 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
20030 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
20040 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
20050 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
20060 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
20070 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
20080 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
20090 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
200a0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
200b0 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
200c0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
200d0 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
200e0 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
200f0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
20100 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
20110 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
20120 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
20130 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
20140 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
20150 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
20160 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
20170 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63        int isExac
20180 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  t = 0;.#ifndef S
20190 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
201a0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
201b0 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
201c0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
201d0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
201e0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
201f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
20200 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
20210 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
20220 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
20230 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
20240 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
20250 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
20260 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
20270 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
20280 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
20290 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
202a0 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e     if( pgnoOvfl>
202b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
202c0 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a  * isExact = 1; *
202d0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
202e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
202f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
20300 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
20310 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
20320 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63  pgnoOvfl, isExac
20330 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
20340 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20350 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
20360 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
20370 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
20380 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
20390 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
203a0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
203b0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
203c0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
203d0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
203e0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
203f0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
20400 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
20410 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
20420 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
20430 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
20440 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
20450 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
20460 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
20470 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
20480 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
20490 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
204a0 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
204b0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
204c0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
204d0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
204e0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
204f0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
20500 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
20510 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
20520 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
20530 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
20540 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20550 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
20560 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
20570 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
20580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20590 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
205a0 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
205b0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
205c0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
205d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
205e0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
205f0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
20600 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
20610 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
20620 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20630 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
20640 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
20650 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
20660 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
20670 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
20680 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20690 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
206a0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
206b0 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
206c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
206d0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
206e0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
206f0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
20700 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
20710 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
20720 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
20730 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
20740 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
20750 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
20760 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
20770 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
20780 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
20790 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
207a0 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
207b0 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e  eLeft;.    if( n
207c0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
207d0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
207e0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
207f0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
20800 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
20810 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
20820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
20830 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
20840 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
20850 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
20860 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
20870 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
20880 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
20890 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
208a0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
208b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
208c0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
208d0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
208e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
208f0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
20900 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
20910 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20920 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50   Change the MemP
20930 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e  age.pParent poin
20940 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ter on the page 
20950 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a  whose number is.
20960 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ** given in the 
20970 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
20980 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e  so that MemPage.
20990 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68  pParent holds th
209a0 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20  e.** pointer in 
209b0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
209c0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
209d0 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 42  t reparentPage(B
209e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
209f0 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65  no pgno, MemPage
20a00 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e   *pNewParent, in
20a10 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67  t idx){.  MemPag
20a20 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61  e *pThis;.  DbPa
20a30 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
20a40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20a50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
20a60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
20a70 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d  rt( pNewParent!=
20a80 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  0 );.  if( pgno=
20a90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
20aa0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
20ab0 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20   pBt->pPager!=0 
20ac0 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
20ad0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
20ae0 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
20af0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
20b00 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73  age ){.    pThis
20b10 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
20b20 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
20b30 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ra(pDbPage);.   
20b40 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e   if( pThis->isIn
20b50 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  it ){.      asse
20b60 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61  rt( pThis->aData
20b70 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
20b80 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
20b90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  ;.      if( pThi
20ba0 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77  s->pParent!=pNew
20bb0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
20bc0 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
20bd0 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61  rent ) sqlite3Pa
20be0 67 65 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e  gerUnref(pThis->
20bf0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
20c00 29 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73  );.        pThis
20c10 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77  ->pParent = pNew
20c20 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  Parent;.        
20c30 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
20c40 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50  pNewParent->pDbP
20c50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
20c60 20 20 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61      pThis->idxPa
20c70 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20  rent = idx;.    
20c80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
20c90 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
20ca0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
20cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20cc0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
20cd0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
20ce0 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
20cf0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50  Put(pBt, pgno, P
20d00 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
20d10 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  wParent->pgno);.
20d20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
20d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20d40 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  ..../*.** Change
20d50 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
20d60 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c  nter of all chil
20d70 64 72 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f  dren of pPage to
20d80 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74   point back.** t
20d90 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  o pPage..**.** I
20da0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66  n other words, f
20db0 6f 72 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f  or every child o
20dc0 66 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20  f pPage, invoke 
20dd0 72 65 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a  reparentPage().*
20de0 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
20df0 68 61 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b  hat each child k
20e00 6e 6f 77 73 20 74 68 61 74 20 70 50 61 67 65 20  nows that pPage 
20e10 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a  is its parent..*
20e20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20e30 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66  e gets called af
20e40 74 65 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29  ter you memcpy()
20e50 20 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a   one page into.*
20e60 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74  * another..*/.st
20e70 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e  atic int reparen
20e80 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50  tChildPages(MemP
20e90 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
20ea0 6e 74 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64  nt i;.  BtShared
20eb0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
20ec0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
20ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
20ee0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20ef0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
20f00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20f10 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
20f20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20f30 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
20f40 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
20f50 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
20f60 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
20f70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
20f80 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
20f90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70  {.      rc = rep
20fa0 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
20fb0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
20fc0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
20fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20fe0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
20ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
21000 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
21010 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
21020 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
21030 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
21040 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
21050 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20  et+8]), .       
21060 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  pPage, i);.    p
21070 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
21080 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
21090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
210a0 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
210b0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
210c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
210d0 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
210e0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
210f0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
21100 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
21110 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
21120 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
21130 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21140 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
21150 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
21160 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
21170 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
21180 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
21190 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
211a0 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
211b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
211c0 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
211d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
211e0 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
211f0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
21200 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
21210 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
21220 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21230 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
21240 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
21250 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
21260 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
21270 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
21280 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
21290 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
212a0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
212b0 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
212c0 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
212d0 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
212e0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
212f0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
21300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
21310 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
21320 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
21330 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
21340 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
21350 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
21360 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21370 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
21380 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
21390 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
213a0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
213b0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
213c0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
213d0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
213e0 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72  te(ptr);.  asser
213f0 74 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73  t( pc>10 && pc+s
21400 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z<=pPage->pBt->u
21410 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66  sableSize );.  f
21420 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
21430 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69  pc, sz);.  for(i
21440 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
21450 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
21460 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
21470 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
21480 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
21490 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
214a0 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
214b0 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
214c0 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
214d0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
214e0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
214f0 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
21500 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
21510 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
21520 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
21530 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
21540 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
21550 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
21560 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
21570 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
21580 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
21590 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
215a0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
215b0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
215c0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
215d0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
215e0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
215f0 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
21600 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
21610 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
21620 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
21630 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
21640 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
21650 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
21660 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
21670 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
21680 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
21690 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
216a0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
216b0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
216c0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
216d0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
216e0 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
216f0 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
21700 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
21710 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
21720 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
21730 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
21740 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
21750 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
21760 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
21770 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
21780 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
21790 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
217a0 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
217b0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
217c0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
217d0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
217e0 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
217f0 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
21800 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
21810 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
21820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
21830 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
21840 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
21850 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
21860 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
21870 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
21880 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
21890 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
218a0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
218b0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
218c0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
218d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
218e0 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
218f0 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
21900 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
21910 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
21920 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
21930 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
21940 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
21950 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
21960 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
21970 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
21980 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
21990 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
219a0 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
219b0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
219c0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
219d0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
219e0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
219f0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
21a00 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21a10 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
21a20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
21a30 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
21a40 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
21a50 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
21a60 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
21a70 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
21a80 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
21a90 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
21aa0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
21ab0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
21ac0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
21ad0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
21ae0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
21af0 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
21b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
21b10 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
21b20 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
21b30 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
21b40 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
21b50 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
21b60 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
21b70 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
21b80 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
21b90 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
21ba0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
21bb0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
21bc0 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
21bd0 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
21be0 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
21bf0 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
21c00 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
21c10 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
21c20 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
21c30 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
21c40 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
21c50 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
21c60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21c70 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21c80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
21c90 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
21ca0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
21cb0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
21cc0 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
21cd0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
21ce0 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
21cf0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
21d00 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
21d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
21d20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
21d30 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
21d40 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  j<sizeof(pPage->
21d50 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
21d60 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29  age->aOvfl[0]) )
21d70 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
21d80 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
21d90 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
21da0 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69  aOvfl[j].idx = i
21db0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
21dc0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
21dd0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
21de0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21df0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
21e00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
21e40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
21e50 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
21e60 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
21e70 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
21e80 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
21e90 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
21ea0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
21eb0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
21ec0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
21ed0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
21ee0 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
21ef0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
21f00 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20  e->nCell + 2;.  
21f10 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
21f20 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66  et + 2*i;.    if
21f30 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a  ( end > top - sz
21f40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   ){.      rc = d
21f50 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
21f60 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
21f70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
21f90 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
21fa0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
21fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
21fc0 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
21fd0 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
21fe0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
21ff0 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
22000 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
22010 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
22020 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
22030 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
22040 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
22050 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
22060 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70   -= 2;.    memcp
22070 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
22080 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
22090 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
220a0 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72  for(j=end-2, ptr
220b0 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
220c0 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
220d0 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
220e0 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
220f0 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
22100 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
22110 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
22120 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
22130 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
22140 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
22150 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68      pPage->idxSh
22160 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ift = 1;.#ifndef
22170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22180 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
22190 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
221a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
221b0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
221c0 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
221d0 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
221e0 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
221f0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
22200 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
22210 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
22220 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
22230 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
22240 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
22250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
22260 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
22270 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
22280 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
22290 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
222a0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
222b0 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
222c0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
222d0 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
222e0 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
222f0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
22300 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
22310 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
22320 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
22330 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
22340 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
22350 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
22360 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
22370 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
22380 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
22390 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
223a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
223b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
223c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
223d0 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
223e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
223f0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
22400 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
22410 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
22420 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
22430 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
22440 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
22450 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
22460 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
22470 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
22480 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
22490 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
224a0 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
224b0 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
224c0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
224d0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
224e0 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
224f0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
22500 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
22510 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
22520 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
22530 20 69 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20   int *aSize     
22540 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
22550 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
22560 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22570 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22580 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
22590 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
225a0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
225b0 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
225c0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
225d0 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
225e0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
225f0 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
22600 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
22610 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
22620 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
22630 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
22640 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
22650 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
22660 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
22670 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
22680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
22690 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
226a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
226b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
226c0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
226d0 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d  );.  totalSize =
226e0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
226f0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
22700 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61    totalSize += a
22710 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61  Size[i];.  }.  a
22720 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65  ssert( totalSize
22730 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  +2*nCell<=pPage-
22740 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65  >nFree );.  asse
22750 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
22760 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ==0 );.  cellptr
22770 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
22780 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
22790 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
227a0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
227b0 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
227c0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
227d0 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
227e0 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
227f0 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
22800 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
22810 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
22820 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
22830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22840 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
22850 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
22860 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
22870 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
22880 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
22890 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
228a0 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
228b0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
228c0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
228d0 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
228e0 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
228f0 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
22900 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
22910 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
22920 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22930 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
22940 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
22950 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
22960 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
22970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
22980 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
22990 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
229a0 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
229b0 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
229c0 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
229d0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
229e0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
229f0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
22a00 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
22a10 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
22a20 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
22a30 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
22a40 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
22a50 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
22a60 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
22a70 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
22a80 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
22a90 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
22aa0 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
22ab0 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
22ac0 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
22ad0 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
22ae0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
22af0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
22b00 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
22b10 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
22b20 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
22b30 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
22b40 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
22b50 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
22b60 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
22b70 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
22b80 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
22b90 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
22ba0 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
22bb0 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
22bc0 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
22bd0 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
22be0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
22bf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
22c00 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
22c10 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
22c20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
22c30 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
22c40 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
22c50 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
22c60 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  nce */../* Forwa
22c70 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
22c80 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
22c90 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74  ce(MemPage*, int
22ca0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22cb0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
22cc0 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
22cd0 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
22ce0 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
22cf0 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
22d00 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
22d10 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
22d20 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
22d30 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
22d40 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
22d50 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
22d60 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
22d70 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
22d80 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
22d90 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
22da0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
22db0 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61  ead of trying ba
22dc0 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
22dd0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
22de0 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
22df0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
22e00 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
22e10 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
22e20 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
22e30 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
22e40 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
22e50 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
22e60 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
22e70 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
22e80 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
22e90 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
22ea0 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
22eb0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
22ec0 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
22ed0 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
22ee0 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
22ef0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
22f00 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
22f10 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
22f20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
22f30 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
22f40 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
22f50 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
22f60 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
22f70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
22f80 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
22f90 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
22fa0 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
22fb0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
22fc0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
22fd0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
22fe0 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
22ff0 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70  Page, MemPage *p
23000 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  Parent){.  int r
23010 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
23020 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e  ew;.  Pgno pgnoN
23030 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
23040 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20  .  int szCell;. 
23050 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
23060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
23070 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
23080 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
23090 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
230a0 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
230b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
230c0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
230d0 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
230e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
230f0 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
23100 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
23110 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23130 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
23140 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
23150 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23160 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
23170 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
23180 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ex) );..  /* All
23190 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
231a0 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
231b0 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
231c0 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
231d0 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
231e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
231f0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
23200 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
23210 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
23220 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
23230 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
23240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23250 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23260 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61   }.  pCell = pPa
23270 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
23280 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63  ll;.  szCell = c
23290 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
232a0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f  , pCell);.  zero
232b0 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
232c0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61  ->aData[0]);.  a
232d0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
232e0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
232f0 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
23300 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
23310 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72    /* Set the par
23320 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79  ent of the newly
23330 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
23340 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
23350 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d   pNew->pParent =
23360 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69   pParent;.  sqli
23370 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
23380 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a  ent->pDbPage);..
23390 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75    /* pPage is cu
233a0 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68  rrently the righ
233b0 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t-child of pPare
233c0 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a  nt. Change this.
233d0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
233e0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20   right-child is 
233f0 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c  the new page all
23400 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64  ocated above and
23410 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74  .  ** pPage is t
23420 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74  he next-to-right
23430 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20   child. .  */.  
23440 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23450 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c  Cell>0 );.  pCel
23460 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
23470 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
23480 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  -1);.  sqlite3Bt
23490 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
234a0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
234b0 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c  nfo);.  rc = fil
234c0 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
234d0 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
234e0 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
234f0 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29   0, &parentSize)
23500 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23520 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
23530 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65  sert( parentSize
23540 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e  <64 );.  rc = in
23550 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
23560 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72  , parentIdx, par
23570 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53  entCell, parentS
23580 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66  ize, 0, 4);.  if
23590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
235a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
235b0 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
235c0 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
235d0 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74  l(pParent,parent
235e0 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Idx), pPage->pgn
235f0 6f 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  o);.  put4byte(&
23600 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
23610 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
23620 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
23630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23640 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
23650 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
23660 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
23670 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
23680 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
23690 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
236a0 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
236b0 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
236c0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
236d0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
236e0 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
236f0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
23700 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
23710 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
23720 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
23730 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
23740 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
23750 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
23760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23770 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
23780 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29  PutOvfl(pNew, 0)
23790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
237a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
237b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
237c0 67 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ge(pNew);.      
237d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
237e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
237f0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
23800 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
23810 65 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61  ew page and bala
23820 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
23830 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73  age,.  ** in cas
23840 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
23850 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73  ll inserted caus
23860 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20  ed it to become 
23870 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20  overfull..  */. 
23880 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
23890 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c  w);.  return bal
238a0 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29  ance(pParent, 0)
238b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
238c0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
238d0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
238e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
238f0 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
23900 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
23910 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
23920 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
23930 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
23940 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
23950 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
23960 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
23970 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
23980 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
23990 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
239a0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
239b0 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
239c0 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
239d0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
239e0 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
239f0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
23a00 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
23a10 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
23a20 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
23a30 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
23a40 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
23a50 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
23a60 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
23a70 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
23a80 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
23a90 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
23aa0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
23ab0 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
23ac0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
23ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
23ae0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
23af0 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
23b00 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
23b10 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
23b20 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
23b30 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
23b40 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
23b50 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
23b60 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
23b70 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
23b80 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
23b90 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
23ba0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
23bb0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
23bc0 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
23bd0 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
23be0 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
23bf0 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
23c00 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
23c10 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
23c20 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
23c30 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
23c40 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
23c50 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
23c60 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
23c70 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
23c80 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
23c90 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
23ca0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
23cb0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
23cc0 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
23cd0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
23ce0 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
23cf0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
23d00 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
23d10 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
23d20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
23d30 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
23d40 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
23d50 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
23d60 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
23d70 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
23d80 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
23d90 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
23da0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
23db0 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
23dc0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
23dd0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
23de0 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
23df0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
23e00 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
23e10 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
23e20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
23e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
23e40 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
23e50 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
23e60 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
23e70 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
23e80 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
23e90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
23ea0 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
23eb0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
23ec0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
23ed0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
23ee0 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65  _nonroot(MemPage
23ef0 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
23f00 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  age *pParent;   
23f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23f20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20  parent of pPage 
23f30 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
23f40 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
23f50 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
23f60 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
23f70 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
23f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23f90 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
23fa0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
23fb0 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
23fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
23fd0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
23fe0 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
23ff0 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
24000 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
24010 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24020 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
24030 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
24040 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
24050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24060 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
24070 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
24080 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  nDiv;           
24090 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
240a0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
240b0 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pDiv[] */.  int 
240c0 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
240d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
240e0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
240f0 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
24100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24110 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e  ndex of pPage in
24120 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
24130 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  ] */.  int nxDiv
24140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24150 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
24160 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
24170 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
24180 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241a0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
241b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43  e */.  int leafC
241c0 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
241d0 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
241e0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
241f0 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
24200 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
24210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24220 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
24230 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
24240 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
24250 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
24260 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
24270 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
24280 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
24290 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242b0 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
242c0 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
242d0 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
242f0 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
24300 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
24310 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
24320 69 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  iSpace = 0;     
24330 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
24340 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
24350 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d   aSpace[] */.  M
24360 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
24370 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
24380 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
24390 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
243a0 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42   Pgno pgnoOld[NB
243b0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
243c0 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
243d0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
243e0 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pOld[] */.  MemP
243f0 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
24400 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
24410 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
24420 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
24430 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
24440 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
24450 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
24460 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
24470 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
24480 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e    Pgno pgnoNew[N
24490 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  B+2];          /
244a0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
244b0 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
244c0 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20  apNew[] */.  u8 
244d0 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20  *apDiv[NB];     
244e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
244f0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
24500 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
24510 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
24520 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24530 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
24540 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
24550 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
24560 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
24570 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
24580 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
24590 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
245a0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
245b0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
245c0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
245d0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
245e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c   */.  int *szCel
245f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
24600 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
24610 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
24620 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
24630 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20  8 *aCopy[NB];   
24640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24650 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
24660 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
24670 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
24680 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24690 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
246a0 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64  hold copies of d
246b0 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f  ividers cells */
246c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
246d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
246e0 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b    u8 *aFrom = 0;
246f0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
24700 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24710 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
24720 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
24730 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  * .  ** Find the
24740 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
24750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24760 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24770 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
24780 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
24790 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
247a0 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
247b0 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20  low==1 );.  pBt 
247c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
247d0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
247e0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
247f0 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20  rt( pParent );. 
24800 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
24810 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
24820 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d  erWrite(pParent-
24830 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20  >pDbPage)) ){.  
24840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24850 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
24860 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
24870 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
24880 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
24890 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
248a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
248b0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
248c0 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70  E.  /*.  ** A sp
248d0 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
248e0 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20  a new entry has 
248f0 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74  just been insert
24900 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ed into a.  ** t
24910 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61  able (that is, a
24920 20 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65   btree with inte
24930 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c  ger keys and all
24940 20 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61   data at the lea
24950 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ves).  ** and th
24960 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74  e new entry is t
24970 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24980 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20  try in the tree 
24990 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a  (it has the.  **
249a0 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68   largest key) th
249b0 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69  en use the speci
249c0 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  al balance_quick
249d0 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20  () routine for. 
249e0 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20   ** balancing.  
249f0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
24a00 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61  is much faster a
24a10 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  nd results in a 
24a20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63  tighter.  ** pac
24a30 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20  king of data in 
24a40 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
24a50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
24a60 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20  e->leaf &&.     
24a70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24a80 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c  &.      pPage->l
24a90 65 61 66 44 61 74 61 20 26 26 0a 20 20 20 20 20  eafData &&.     
24aa0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24ab0 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50  w==1 &&.      pP
24ac0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  age->aOvfl[0].id
24ad0 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x==pPage->nCell 
24ae0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24af0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
24b00 20 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79   &&.      get4by
24b10 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
24b20 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
24b30 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65  ffset+8])==pPage
24b40 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20  ->pgno.  ){.    
24b50 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  /*.    ** TODO: 
24b60 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e  Check the siblin
24b70 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  gs to the left o
24b80 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20  f pPage. It may 
24b90 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  be that.    ** t
24ba0 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c  hey are not full
24bb0 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65   and no new page
24bc0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
24bd0 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
24be0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
24bf0 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
24c00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
24c10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
24c20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24c30 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
24c40 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ge)) ){.    retu
24c50 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
24c60 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  .  ** Find the c
24c70 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e  ell in the paren
24c80 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66  t page whose lef
24c90 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62  t child points b
24ca0 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67  ack.  ** to pPag
24cb0 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61  e.  The "idx" va
24cc0 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e  riable is the in
24cd0 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c  dex of that cell
24ce0 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a  .  If pPage.  **
24cf0 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73   is the rightmos
24d00 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
24d10 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20  nt then set idx 
24d20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  to pParent->nCel
24d30 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l .  */.  if( pP
24d40 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20  arent->idxShift 
24d50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
24d60 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61  ;.    pgno = pPa
24d70 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  ge->pgno;.    as
24d80 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69  sert( pgno==sqli
24d90 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
24da0 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
24db0 65 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64  e) );.    for(id
24dc0 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74  x=0; idx<pParent
24dd0 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b  ->nCell; idx++){
24de0 0a 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62  .      if( get4b
24df0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24e00 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e  rent, idx))==pgn
24e10 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  o ){.        bre
24e20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
24e30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  }.    assert( id
24e40 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
24e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
24e60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
24e70 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
24e80 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
24e90 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73  ==pgno );.  }els
24ea0 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61  e{.    idx = pPa
24eb0 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20  ge->idxParent;. 
24ec0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e   }..  /*.  ** In
24ed0 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c  itialize variabl
24ee0 65 73 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  es so that it wi
24ef0 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75  ll be safe to ju
24f00 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  mp.  ** directly
24f10 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61   to balance_clea
24f20 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e  nup at any momen
24f30 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d  t..  */.  nOld =
24f40 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c   nNew = 0;.  sql
24f50 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
24f60 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
24f70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
24f80 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
24f90 20 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63   pPage and the c
24fa0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
24fb0 74 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a  that divide.  **
24fc0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20   the siblings.  
24fd0 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
24fe0 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69  de to find NN si
24ff0 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
25000 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50  .  ** side of pP
25010 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69  age.  More sibli
25020 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
25030 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77  om one side, how
25040 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50  ever, if.  ** pP
25050 61 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65  age there are fe
25060 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
25070 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
25080 72 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72  r side.  If pPar
25090 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
250a0 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
250b0 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
250c0 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
250d0 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20  re taken..  */. 
250e0 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e   nxDiv = idx - N
250f0 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b  N;.  if( nxDiv +
25100 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e   NB > pParent->n
25110 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69  Cell ){.    nxDi
25120 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  v = pParent->nCe
25130 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d  ll - NB + 1;.  }
25140 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29  .  if( nxDiv<0 )
25150 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
25160 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b  .  }.  nDiv = 0;
25170 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78  .  for(i=0, k=nx
25180 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20  Div; i<NB; i++, 
25190 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c  k++){.    if( k<
251a0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
251b0 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
251c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
251d0 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e  ent, k);.      n
251e0 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Div++;.      ass
251f0 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c  ert( !pParent->l
25200 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e  eaf );.      pgn
25210 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79  oOld[i] = get4by
25220 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
25230 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70    }else if( k==p
25240 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
25250 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
25260 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  ] = get4byte(&pP
25270 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
25280 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
25290 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
252a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
252b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41   }.    rc = getA
252c0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
252d0 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f  pgnoOld[i], &apO
252e0 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b  ld[i], pParent);
252f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
25300 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
25310 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  up;.    apOld[i]
25320 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b  ->idxParent = k;
25330 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d  .    apCopy[i] =
25340 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
25350 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e  i==nOld );.    n
25360 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43  Old++;.    nMaxC
25370 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
25380 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
25390 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
253a0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
253b0 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
253c0 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72 64 65 72  le of 2 in order
253d0 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
253e0 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
253f0 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
25400 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
25410 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20   1)&~1;..  /*.  
25420 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
25430 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
25440 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61  uctures.  */.  a
25450 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f  pCell = sqlite3_
25460 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 20  malloc( .       
25470 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
25480 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
254b0 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
254c0 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20  zeof(int)       
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254e0 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
254f0 0a 20 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73  .     + ROUND8(s
25500 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a  izeof(MemPage))*
25510 4e 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NB              
25520 20 20 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79          /* aCopy
25530 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
25540 70 61 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20  pageSize*(5+NB) 
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
25570 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28  pace */.     + (
25580 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e  ISAUTOVACUUM ? n
25590 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20  MaxCells : 0)   
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
255b0 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a  * aFrom */.  );.
255c0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
255d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
255e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
255f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
25600 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
25610 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c   = (int*)&apCell
25620 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
25630 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
25640 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
25650 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
25660 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61  Copy[0] - (u8*)a
25670 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
25680 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
25690 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
256a0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
256b0 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
256c0 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
256d0 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
256e0 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
256f0 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
25700 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
25710 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  i] - (u8*)apCell
25720 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
25730 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
25740 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
25750 0a 20 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f  .  aSpace = &aCo
25760 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61  py[NB-1][pBt->pa
25770 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
25780 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
25790 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70  .  assert( ((aSp
257a0 61 63 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  ace - (u8*)apCel
257b0 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
257c0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
257d0 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69  t required */.#i
257e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
257f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
25800 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
25810 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  um ){.    aFrom 
25820 3d 20 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d  = &aSpace[5*pBt-
25830 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a  >pageSize];.  }.
25840 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20  #endif.  .  /*. 
25850 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   ** Make copies 
25860 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  of the content o
25870 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20  f pPage and its 
25880 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f  siblings into aO
25890 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72  ld[]..  ** The r
258a0 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
258b0 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
258c0 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
258d0 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74  es rather.  ** t
258e0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
258f0 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
25900 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
25910 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
25920 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
25930 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
25940 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
25950 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
25960 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d      MemPage *p =
25970 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
25980 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b  mPage*)aCopy[i];
25990 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61  .    memcpy(p, a
259a0 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
259b0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
259c0 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
259d0 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  )&p[1];.    memc
259e0 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f  py(p->aData, apO
259f0 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
25a00 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
25a10 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  }..  /*.  ** Loa
25a20 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
25a30 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
25a40 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
25a50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
25a60 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
25a70 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
25a80 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
25a90 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
25aa0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
25ab0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f  pace obtained fo
25ac0 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64 20  rm aSpace[] and 
25ad0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
25ae0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
25af0 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
25b00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
25b10 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
25b20 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
25b30 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
25b40 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
25b50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
25b60 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
25b70 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
25b80 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
25b90 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
25ba0 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  ce[].  In this w
25bb0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
25bc0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
25bd0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
25be0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
25bf0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
25c00 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
25c10 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
25c20 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
25c30 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
25c40 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
25c50 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
25c60 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
25c70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
25c80 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
25c90 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
25ca0 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
25cb0 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
25cc0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
25cd0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
25ce0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
25cf0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
25d00 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
25d10 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c    nCell = 0;.  l
25d20 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
25d30 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20  pPage->leaf*4;. 
25d40 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67   leafData = pPag
25d50 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70  e->leafData && p
25d60 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f  Page->leaf;.  fo
25d70 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
25d80 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
25d90 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
25da0 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  i];.    int limi
25db0 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
25dc0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
25dd0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
25de0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
25df0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
25e00 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
25e10 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
25e20 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
25e30 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
25e40 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
25e50 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
25e60 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
25e70 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell]);.#ifndef S
25e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25e90 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
25ea0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25eb0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
25ec0 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b  ;.        aFrom[
25ed0 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20  nCell] = i;.    
25ee0 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70      for(a=0; a<p
25ef0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  Old->nOverflow; 
25f00 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  a++){.          
25f10 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  if( pOld->aOvfl[
25f20 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c  a].pCell==apCell
25f30 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20  [nCell] ){.     
25f40 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
25f50 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
25f60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25f70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25f80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
25f90 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  dif.      nCell+
25fa0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
25fb0 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20   i<nOld-1 ){.   
25fc0 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c     int sz = cell
25fd0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
25fe0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
25ff0 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
26000 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74  {.        /* Wit
26010 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66  h the LEAFDATA f
26020 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c  lag, pParent cel
26030 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54  ls hold only INT
26040 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20  KEYs that.      
26050 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61    ** are duplica
26060 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74  tes of keys on t
26070 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20  he child pages. 
26080 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f   We need to remo
26090 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ve.        ** th
260a0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
260b0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75  from pParent, bu
260c0 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63  t the dividers c
260d0 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20  ells are not.   
260e0 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
260f0 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73   apCell[] becaus
26100 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69  e they are dupli
26110 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63  cates of child c
26120 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ells..        */
26130 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
26140 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
26150 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , sz);.      }el
26160 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  se{.        u8 *
26170 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  pTemp;.        a
26180 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
26190 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
261a0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
261b0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54  = sz;.        pT
261c0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
261d0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
261e0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
261f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
26200 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
26210 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
26220 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
26230 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
26240 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
26250 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
26260 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64  orrection;.#ifnd
26270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26280 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
26290 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
262a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
262b0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
262c0 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
262d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
262e0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
262f0 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
26300 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
26310 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72  ell] -= leafCorr
26320 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
26330 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
26340 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64  (pTemp)==pgnoOld
26350 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  [i] );.        i
26360 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
26370 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26380 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
26390 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
263a0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
263b0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
263c0 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
263d0 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
263e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
263f0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
26400 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
26410 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
26420 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
26430 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68  d->aData[pOld->h
26440 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b  drOffset+8], 4);
26450 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26460 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26470 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
26480 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==4 );.         
26490 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
264a0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
264b0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
264c0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
264d0 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
264e0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
264f0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
26500 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
26510 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26520 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
26530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
26540 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
26550 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
26560 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
26570 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
26580 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
26590 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
265a0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
265b0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
265c0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
265d0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
265e0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
265f0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
26600 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
26610 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
26620 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
26630 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
26640 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
26650 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
26660 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
26670 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
26680 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
26690 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
266a0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
266b0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
266c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
266d0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
266e0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
266f0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
26700 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
26710 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
26720 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
26730 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
26740 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
26750 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
26760 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
26770 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
26780 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
26790 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
267a0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
267b0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
267c0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
267d0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
267e0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
267f0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
26800 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
26810 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
26820 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
26830 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
26840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
26850 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
26860 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
26870 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
26880 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
26890 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
268a0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
268b0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
268c0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
268d0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
268e0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
268f0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
26900 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
26910 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
26920 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
26930 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
26940 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
26950 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
26960 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
26970 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
26980 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
26990 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
269a0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
269b0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
269c0 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
269d0 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
269e0 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
269f0 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
26a00 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
26a10 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
26a20 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
26a30 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
26a40 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
26a50 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
26a60 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
26a70 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
26a80 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
26a90 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
26aa0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
26ab0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
26ac0 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
26ad0 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
26ae0 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
26af0 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
26b00 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
26b10 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
26b20 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
26b30 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
26b40 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
26b50 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
26b60 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
26b70 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
26b80 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
26b90 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
26ba0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
26bb0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
26bc0 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
26bd0 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
26be0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
26bf0 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
26c00 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
26c10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26c20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
26c30 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
26c40 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c60 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
26c70 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
26c80 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
26c90 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
26ca0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
26cb0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
26cc0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
26cd0 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
26ce0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26cf0 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
26d00 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
26d10 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
26d20 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
26d30 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
26d40 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
26d50 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
26d60 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
26d70 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
26d80 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
26d90 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
26da0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
26db0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
26dc0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
26dd0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
26de0 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
26df0 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
26e00 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
26e10 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
26e20 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
26e30 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
26e40 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
26e50 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
26e60 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
26e70 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
26e80 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
26e90 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
26ea0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
26eb0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
26ec0 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
26ed0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26ee0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
26ef0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
26f00 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
26f10 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
26f20 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
26f30 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
26f40 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
26f50 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
26f60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26f70 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
26f80 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
26f90 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
26fa0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
26fb0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
26fc0 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
26fd0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
26fe0 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
26ff0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
27000 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
27010 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
27020 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
27030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27040 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
27050 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
27060 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
27070 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
27080 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
27090 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
270a0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
270b0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
270c0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
270d0 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
270e0 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
270f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
27100 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
27110 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
27120 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
27130 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
27140 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28   }.    zeroPage(
27150 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
27160 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
27170 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
27180 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
27190 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
271a0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
271b0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
271c0 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
271d0 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
271e0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
271f0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
27200 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
27210 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
27220 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
27230 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
27240 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
27250 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
27260 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
27270 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
27280 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
27290 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
272a0 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
272b0 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
272c0 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
272d0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
272e0 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
272f0 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
27300 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
27310 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
27320 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
27330 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
27340 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
27350 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
27360 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
27370 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
27380 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
27390 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
273a0 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
273b0 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
273c0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
273d0 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
273e0 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
273f0 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
27400 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
27410 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
27420 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
27430 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
27440 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
27450 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
27460 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
27470 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e    int minV = pgn
27480 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  oNew[i];.    int
27490 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
274a0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
274b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
274c0 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67  gnoNew[j]<(unsig
274d0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
274e0 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
274f0 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e        minV = pgn
27500 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  oNew[j];.      }
27510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
27520 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
27530 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
27540 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
27550 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
27560 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
27570 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
27580 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d  w[i] = pgnoNew[m
27590 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
275a0 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
275b0 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  I];.      pgnoNe
275c0 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20  w[minI] = t;.   
275d0 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
275e0 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
275f0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
27600 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
27610 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28   new: %d(%d) %d(
27620 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
27630 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
27640 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20   pgnoOld[0], .  
27650 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f    nOld>=2 ? pgno
27660 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[1] : 0,.    
27670 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c  nOld>=3 ? pgnoOl
27680 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67  d[2] : 0,.    pg
27690 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b  noNew[0], szNew[
276a0 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
276b0 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30  ? pgnoNew[1] : 0
276c0 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
276d0 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
276e0 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=3 ? pgnoNew[
276f0 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  2] : 0, nNew>=3 
27700 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
27710 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67      nNew>=4 ? pg
27720 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e  noNew[3] : 0, nN
27730 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
27740 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
27750 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a  5 ? pgnoNew[4] :
27760 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
27770 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
27780 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
27790 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
277a0 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
277b0 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
277c0 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
277d0 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
277e0 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
277f0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
27800 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
27810 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
27820 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
27830 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
27840 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
27850 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
27860 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
27870 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
27880 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27890 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  pNew->pgno==pgno
278a0 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73  New[i] );.    as
278b0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
278c0 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
278d0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
278e0 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
278f0 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
27900 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
27910 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
27920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
27930 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
27940 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
27950 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27960 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  UM.    /* If thi
27970 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
27980 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
27990 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
279a0 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20   map entries.   
279b0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
279c0 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  o the siblings t
279d0 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e  hat were rearran
279e0 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62  ged. These can b
279f0 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63  e: left.    ** c
27a00 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73  hildren of cells
27a10 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  , the right-chil
27a20 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f  d of the page, o
27a30 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
27a40 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  .    ** pointed 
27a50 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20  to by cells..   
27a60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
27a70 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
27a80 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c       for(k=j; k<
27a90 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b  cntNew[i]; k++){
27aa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27ab0 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   k<nMaxCells );.
27ac0 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f          if( aFro
27ad0 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70  m[k]==0xFF || ap
27ae0 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e  Copy[aFrom[k]]->
27af0 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
27b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
27b10 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
27b20 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20  (pNew, k-j);.   
27b30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
27b60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27b80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27b90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20  }.#endif..    j 
27ba0 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
27bb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
27bc0 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
27bd0 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
27be0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27bf0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
27c00 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
27c10 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
27c20 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
27c30 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
27c40 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
27c50 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
27c60 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
27c70 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
27c80 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
27c90 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
27ca0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
27cb0 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
27cc0 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
27cd0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
27ce0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
27cf0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
27d00 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
27d10 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
27d20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  4);.        pTem
27d30 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
27d40 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
27d50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
27d60 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
27d70 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
27d80 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
27d90 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
27da0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
27db0 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
27dc0 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
27dd0 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
27de0 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
27df0 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
27e00 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
27e10 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
27e20 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
27e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27e40 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
27e50 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
27e60 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
27e70 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
27e80 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
27e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27ea0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
27eb0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
27ec0 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
27ed0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53 70      pCell = &aSp
27ee0 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
27ef0 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28       fillInCell(
27f00 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20  pParent, pCell, 
27f10 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
27f20 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
27f30 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
27f40 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
27f50 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
27f60 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
27f70 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
27f80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27f90 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
27fa0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
27fb0 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
27fc0 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
27fd0 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
27fe0 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
27ff0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
28000 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   );.        /* O
28010 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
28020 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
28030 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
28040 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
28050 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
28060 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
28070 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
28080 74 27 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  t's reported siz
28090 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
280a0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
280b0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
280c0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
280d0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
280e0 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
280f0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
28100 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
28110 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
28120 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
28130 65 6c 6c 29 2e 20 42 75 74 20 69 74 27 73 20 69  ell). But it's i
28140 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
28150 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
28160 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
28170 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
28180 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
28190 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
281a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
281b0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
281c0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
281d0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
281e0 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
281f0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
28200 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
28210 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
28220 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
28230 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
28240 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
28250 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
28260 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
28270 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28280 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
28290 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
282a0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
282b0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
282c0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
282d0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
282e0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
282f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28300 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
28310 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
28320 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
28330 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
28340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28350 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
28360 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75  leanup;.      pu
28370 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
28380 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
28390 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
283a0 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
283b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
283c0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
283d0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
283e0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
283f0 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
28400 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
28410 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
28420 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
28430 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
28440 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
28450 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
28460 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
28470 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
28480 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
28490 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
284a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
284b0 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
284c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
284d0 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
284e0 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
284f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28510 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
28520 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
28530 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
28540 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  f.      j++;.   
28550 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
28560 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
28570 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
28580 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
28590 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
285a0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
285b0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
285c0 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==0 ){.    memcp
285d0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
285e0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43  ->aData[8], &apC
285f0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
28600 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20  ta[8], 4);.  }. 
28610 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
28620 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
28630 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
28640 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
28650 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
28660 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
28670 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
28680 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
28690 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
286a0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
286b0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
286c0 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
286d0 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
286e0 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
286f0 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
28700 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
28710 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
28720 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
28730 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
28740 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
28750 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
28760 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
28770 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
28780 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
28790 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
287a0 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
287b0 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
287c0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
287d0 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
287e0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
287f0 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69  apNew[i]);.    i
28800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28810 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28820 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
28830 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
28840 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b  dPages(pParent);
28850 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
28860 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
28870 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
28880 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
28890 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
288a0 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
288b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
288c0 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
288d0 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
288e0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
288f0 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
28900 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
28910 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
28920 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
28930 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
28940 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
28950 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
28960 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72  t->isInit );.  r
28970 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72  c = balance(pPar
28980 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  ent, 0);.  .  /*
28990 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
289a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
289b0 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
289c0 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 5f  anup:.  sqlite3_
289d0 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  free(apCell);.  
289e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
289f0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
28a00 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
28a10 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
28a20 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
28a30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
28a40 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pNew[i]);.  }.  
28a50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
28a60 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ent);.  TRACE(("
28a70 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
28a80 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25  d with %d: old=%
28a90 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
28aa0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
28ab0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c  pPage->pgno, nOl
28ac0 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
28ad0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28ae0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28af0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
28b00 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
28b10 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
28b20 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
28b30 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
28b40 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
28b50 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
28b60 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
28b70 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
28b80 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
28b90 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
28ba0 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65  hallower(MemPage
28bb0 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
28bc0 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
28bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28be0 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20  only child page 
28bf0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67  of pPage */.  Pg
28c00 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
28c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28c20 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43  ge number for pC
28c30 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  hild */.  int rc
28c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28c50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28c60 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
28c70 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74  ocedures */.  Bt
28c80 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ca0 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20   The main BTree 
28cb0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
28cc0 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  nt mxCellPerPage
28cd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
28ce0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
28cf0 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20   cells per page 
28d00 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
28d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66    /* All cells f
28d30 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20  rom pages being 
28d40 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
28d50 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  t *szCell;      
28d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
28d70 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
28d80 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65  cells */..  asse
28d90 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
28da0 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
28db0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
28dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28dd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28de0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
28df0 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d  utex) );.  pBt =
28e00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
28e10 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
28e20 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
28e30 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f  pCell = sqlite3_
28e40 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65  malloc( mxCellPe
28e50 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
28e60 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  *)+sizeof(int)) 
28e70 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
28e80 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
28e90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
28ea0 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
28eb0 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
28ec0 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
28ed0 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
28ee0 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
28ef0 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
28f00 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
28f10 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
28f20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
28f30 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
28f40 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
28f50 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
28f60 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
28f70 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
28f80 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
28f90 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
28fa0 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
28fb0 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
28fc0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
28fd0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
28fe0 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
28ff0 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
29000 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
29010 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
29020 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
29030 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
29040 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
29050 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
29060 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
29070 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
29080 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
29090 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
290a0 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
290b0 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
290c0 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
290d0 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
290e0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
290f0 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
29100 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
29110 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
29120 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
29130 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
29140 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
29150 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
29160 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
29170 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
29180 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
29190 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
291a0 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
291b0 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
291c0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
291d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
291e0 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
291f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29200 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29210 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
29220 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
29230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
29240 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33  noChild<=sqlite3
29250 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
29260 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
29270 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
29280 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
29290 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
292a0 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
292b0 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
292c0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
292d0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
292e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
292f0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
29300 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
29310 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
29320 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
29330 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
29340 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
29350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29360 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
29370 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
29380 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
29390 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
293a0 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
293b0 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
293c0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
293d0 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
293e0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
293f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
29400 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
29410 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
29420 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
29430 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
29440 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
29450 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
29460 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
29470 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
29480 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
29490 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
294a0 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
294b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
294c0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
294d0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
294e0 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
294f0 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
29500 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
29510 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
29520 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
29530 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
29540 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29550 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29560 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
29570 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
29580 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
29590 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
295a0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
295b0 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
295c0 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
295d0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
295e0 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
295f0 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
29600 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
29610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29620 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
29630 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
29640 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
29650 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
29660 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
29670 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
29680 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
29690 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
296a0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
296b0 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
296c0 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
296d0 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
296e0 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
296f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
29700 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
29710 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
29720 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
29730 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
29740 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
29750 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
29760 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
29770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29780 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
29790 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
297a0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
297b0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
297c0 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
297d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
297e0 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
297f0 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
29800 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
29810 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
29820 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
29830 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
29840 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
29850 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20  dPages(pPage);. 
29860 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29870 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
29880 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
29890 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
298a0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
298b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
298c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
298d0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
298e0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20  >nCell; i++){ . 
298f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29900 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c  apPutOvfl(pPage,
29910 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
29920 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29930 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
29940 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
29950 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ance;.        }.
29960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
29970 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65  ndif.    release
29980 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
29990 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
299a0 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33  lance:.  sqlite3
299b0 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
299c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
299d0 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
299e0 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
299f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
29a00 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
29a10 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
29a20 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
29a30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
29a40 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
29a50 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
29a60 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
29a70 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
29a80 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
29a90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
29aa0 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
29ab0 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
29ac0 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
29ad0 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
29ae0 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
29af0 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
29b00 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
29b10 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
29b20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
29b30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
29b40 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
29b50 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
29b60 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
29b70 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
29b80 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
29b90 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
29ba0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
29bb0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29bc0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
29bd0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
29be0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
29bf0 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
29c00 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
29c10 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
29c20 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
29c30 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
29c40 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
29c50 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
29c60 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
29c70 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
29c80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
29c90 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
29ca0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
29cb0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
29cc0 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
29cd0 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
29ce0 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
29cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
29d00 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
29d10 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
29d20 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
29d30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
29d40 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
29d50 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
29d60 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
29d70 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
29d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29d90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
29da0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
29db0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
29dc0 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
29dd0 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
29de0 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
29df0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29e00 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
29e10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29e20 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
29e30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
29e40 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
29e50 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
29e60 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
29e70 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
29e80 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72  >hdrOffset;.  br
29e90 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
29ea0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
29eb0 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
29ec0 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
29ed0 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
29ee0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
29ef0 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
29f00 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
29f10 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64  (&cdata[brk], &d
29f20 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
29f30 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73  Size-brk);.  ass
29f40 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49  ert( pChild->isI
29f50 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nit==0 );.  rc =
29f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
29f70 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
29f80 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
29f90 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
29fa0 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  per_out;.  memcp
29fb0 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
29fc0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70   pPage->aOvfl, p
29fd0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
29fe0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
29ff0 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
2a000 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
2a010 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a020 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
2a030 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2a040 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
2a050 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
2a060 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
2a070 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
2a080 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67  .  zeroPage(pPag
2a090 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2a0a0 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
2a0b0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2a0c0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2a0d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2a0e0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52  pgnoChild);.  TR
2a0f0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2a100 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
2a110 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2a120 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
2a130 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  o));.#ifndef SQL
2a140 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a150 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
2a160 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2a170 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d   int i;.    rc =
2a180 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2a190 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
2a1a0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
2a1b0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  e->pgno);.    if
2a1c0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2a1d0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2a1e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
2a1f0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
2a200 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2a210 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69  rmapPutOvfl(pChi
2a220 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ld, i);.      if
2a230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a240 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2a250 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2a260 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2a270 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
2a280 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a  nroot(pChild);..
2a290 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2a2a0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
2a2b0 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  (pChild);.  retu
2a2c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a2d0 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61  Decide if the pa
2a2e0 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74  ge pPage needs t
2a2f0 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20  o be balanced.  
2a300 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a  If balancing is.
2a310 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c  ** required, cal
2a320 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  l the appropriat
2a330 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  e balancing rout
2a340 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
2a350 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
2a360 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2a370 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63  nsert){.  int rc
2a380 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a390 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a3a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2a3b0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2a3c0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
2a3d0 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arent==0 ){.    
2a3e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a3f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2a400 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2a410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a420 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2a430 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
2a440 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
2a450 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2a460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a470 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2a480 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2a490 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
2a4a0 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a  allower(pPage);.
2a4b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2a4c0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
2a4d0 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
2a4e0 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26        (!insert &
2a4f0 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
2a500 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2a510 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
2a520 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2a530 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b  _nonroot(pPage);
2a540 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a560 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
2a570 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
2a580 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
2a590 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
2a5a0 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
2a5b0 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
2a5c0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
2a5d0 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2a5e0 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2a5f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2a600 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a610 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2a620 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2a630 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2a640 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2a650 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2a660 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2a670 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2a680 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2a690 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2a6a0 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2a6b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2a6c0 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e  *.** In addition
2a6d0 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   to checking for
2a6e0 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65   read-locks (whe
2a6f0 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a  re a read-lock .
2a700 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f  ** means a curso
2a710 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  r opened with wr
2a720 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f  Flag==0) this ro
2a730 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73  utine also moves
2a740 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20 63 75  .** all write cu
2a750 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68  rsors so that th
2a760 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
2a770 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  to the .** first
2a780 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f   Cell on the roo
2a790 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  t page.  This is
2a7a0 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
2a7b0 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a  se an insert .**
2a7c0 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74   or delete might
2a7d0 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62   change the numb
2a7e0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
2a7f0 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a   page or delete.
2a800 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65  ** a page entire
2a810 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  ly and we do not
2a820 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61   want to leave a
2a830 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70  ny cursors .** p
2a840 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65  ointing to non-e
2a850 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72  xistant pages or
2a860 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
2a870 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2a880 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72  ocks(Btree *pBtr
2a890 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ee, Pgno pgnoRoo
2a8a0 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
2a8b0 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73  clude){.  BtCurs
2a8c0 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
2a8d0 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
2a8e0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
2a8f0 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53  *db = pBtree->pS
2a900 71 6c 69 74 65 3b 0a 20 20 61 73 73 65 72 74 28  qlite;.  assert(
2a910 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2a920 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
2a930 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2a940 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2a950 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2a960 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2a970 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2a980 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2a990 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2a9a0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2a9b0 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2a9c0 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ot ) continue;. 
2a9d0 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2a9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2a9f0 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2aa00 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  p->pBtree->pSqli
2aa10 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  te;.      if( db
2aa20 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20  Other==0 ||.    
2aa30 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64       (dbOther!=d
2aa40 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66  b && (dbOther->f
2aa50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2aa60 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d  adUncommitted)==
2aa70 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
2aa80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2aa90 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
2aaa0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61  }else if( p->pPa
2aab0 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e  ge->pgno!=p->pgn
2aac0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d  oRoot ){.      m
2aad0 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20  oveToRoot(p);.  
2aae0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2aaf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2ab00 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2ab10 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2ab20 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2ab30 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2ab40 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2ab50 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2ab60 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2ab70 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2ab80 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2ab90 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2aba0 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
2abb0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
2abc0 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
2abd0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2abe0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2abf0 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2ac00 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
2ac10 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
2ac20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
2ac30 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
2ac40 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
2ac50 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
2ac60 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
2ac70 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
2ac80 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
2ac90 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2aca0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
2acb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2acc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2acd0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
2ace0 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
2acf0 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
2ad00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2ad10 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2ad20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
2ad30 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2ad40 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2ad50 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
2ad60 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
2ad70 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2ad80 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ada0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2adb0 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
2adc0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
2add0 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
2ade0 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20  dBias           
2adf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ae00 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
2ae10 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  an append */.){.
2ae20 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2ae30 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77  loc;.  int szNew
2ae40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ae50 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
2ae60 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
2ae70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2ae80 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
2ae90 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
2aea0 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
2aeb0 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
2aec0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2aed0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2aee0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r) );.  if( pBt-
2aef0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2af00 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2af10 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2af20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2af30 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
2af40 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63 20  nsert */.    rc 
2af50 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2af60 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2af70 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2af80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2af90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2afa0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2afb0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2afc0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2afd0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2afe0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20    /* Cursor not 
2aff0 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
2b000 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2b010 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2b020 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2b030 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2b040 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b050 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2b060 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2b070 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2b080 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2b090 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2b0a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2b0b0 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2b0c0 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2b0d0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
2b0e0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2b0f0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
2b100 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
2b110 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f   */.  clearCurso
2b120 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2b130 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49  .  if( .    SQLI
2b140 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2b150 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2b160 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2b170 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53   pCur)) ||.    S
2b180 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2b190 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2b1a0 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
2b1b0 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
2b1c0 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20   &loc)).  ){.   
2b1d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2b1e0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2b1f0 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
2b200 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2b210 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  || nKey>=0 );.  
2b220 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2b230 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c  eaf || !pPage->l
2b240 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41  eafData );.  TRA
2b250 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62  CE(("INSERT: tab
2b260 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20  le=%d nkey=%lld 
2b270 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64  ndata=%d page=%d
2b280 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
2b290 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2b2a0 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70  , nKey, nData, p
2b2b0 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20  Page->pgno,.    
2b2c0 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22        loc==0 ? "
2b2d0 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65  overwrite" : "ne
2b2e0 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73  w entry"));.  as
2b2f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2b300 6e 69 74 20 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  nit );.  newCell
2b310 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2b320 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  c( MX_CELL_SIZE(
2b330 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65  pBt) );.  if( ne
2b340 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
2b350 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2b360 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2b370 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
2b380 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
2b390 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72  ata, nData, nZer
2b3a0 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66  o, &szNew);.  if
2b3b0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2b3c0 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74  insert;.  assert
2b3d0 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a  ( szNew==cellSiz
2b3e0 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43  ePtr(pPage, newC
2b3f0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
2b400 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c  ( szNew<=MX_CELL
2b410 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
2b420 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55  if( loc==0 && CU
2b430 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2b440 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2b450 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  int szOld;.    a
2b460 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
2b470 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
2b480 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2b490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b4a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2b4b0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2b4c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2b4d0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2b4e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
2b4f0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2b500 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2b510 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2b520 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2b530 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
2b540 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
2b550 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
2b560 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2b570 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
2b580 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2b590 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2b5a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2b5b0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2b5c0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2b5d0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f  , pCur->idx, szO
2b5e0 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ld);.  }else if(
2b5f0 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
2b600 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2b610 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2b620 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  eaf );.    pCur-
2b630 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72  >idx++;.    pCur
2b640 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2b650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2b660 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2b670 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
2b680 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2b690 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65  e, pCur->idx, ne
2b6a0 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
2b6b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
2b6c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2b6d0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63  end_insert;.  rc
2b6e0 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2b6f0 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74  , 1);.  /* sqlit
2b700 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
2b710 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d  pCur->pBt, pCur-
2b720 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a  >pgnoRoot, 1); *
2b730 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73 74  /.  /* fflush(st
2b740 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20  dout); */.  if( 
2b750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b760 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2b770 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
2b780 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74 65 33  nsert:.  sqlite3
2b790 5f 66 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  _free(newCell);.
2b7a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b7b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2b7c0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2b7d0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2b7e0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2b7f0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2b800 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2b810 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2b820 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b830 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2b840 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2b850 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2b860 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2b870 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2b880 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2b890 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2b8a0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
2b8b0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
2b8c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2b8d0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2b8e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2b8f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b900 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2b910 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  t );.  if( pBt->
2b920 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2b930 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2b940 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2b950 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2b960 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c  fore doing a del
2b970 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ete */.    rc = 
2b980 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2b990 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2b9a0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2b9b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b9c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2b9d0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2b9e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2b9f0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2ba00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
2ba10 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
2ba20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2ba30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2ba40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ba50 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2ba60 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2ba70 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2ba80 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2ba90 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2baa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bab0 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2bac0 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2bad0 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2bae0 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2baf0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2bb00 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2bb10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2bb20 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2bb30 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2bb40 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2bb50 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2bb60 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2bb70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2bb80 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2bb90 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2bba0 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2bbb0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2bbc0 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2bbd0 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2bbe0 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2bbf0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2bc00 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2bc10 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2bc20 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2bc30 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2bc40 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2bc50 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2bc60 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2bc70 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2bc80 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2bc90 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
2bca0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2bcb0 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
2bcc0 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2bcd0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2bce0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2bcf0 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2bd00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2bd10 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2bd20 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
2bd30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2bd40 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
2bd50 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
2bd60 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  's page and leav
2bd70 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2bd80 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2bd90 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2bda0 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2bdb0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2bdc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2bdd0 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2bde0 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2bdf0 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2be00 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
2be10 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2be20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
2be30 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2be40 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2be50 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2be60 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2be70 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2be80 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2be90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2bea0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
2beb0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2bec0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65   /*.    ** The e
2bed0 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75  ntry we are abou
2bee0 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  t to delete is n
2bef0 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20  ot a leaf so if 
2bf00 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  we do not.    **
2bf10 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   do something we
2bf20 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f   will leave a ho
2bf30 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61  le on an interna
2bf40 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57  l page..    ** W
2bf50 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74  e have to fill t
2bf60 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e  he hole by movin
2bf70 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d  g in a cell from
2bf80 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20   a leaf.  The.  
2bf90 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61    ** next Cell a
2bfa0 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20  fter the one to 
2bfb0 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75  be deleted is gu
2bfc0 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
2bfd0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20  t and.    ** to 
2bfe0 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20  be a leaf so we 
2bff0 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  can use it..    
2c000 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  */.    BtCursor 
2c010 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73  leafCur;.    uns
2c020 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78  igned char *pNex
2c030 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65 78  t;.    int szNex
2c040 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 69  t;  /* The compi
2c050 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73 20 77  ler warning is w
2c060 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69 73 20  rong: szNext is 
2c070 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20 20 20  always .        
2c080 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74           ** init
2c090 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75  ialized before u
2c0a0 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e 20 65  se.  Adding an e
2c0b0 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
2c0c0 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
2c0d0 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e       ** to silen
2c0e0 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ce the compiler 
2c0f0 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65 20 63  slows down the c
2c100 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ode. */.    int 
2c110 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73  notUsed;.    uns
2c120 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
2c130 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  Cell = 0;.    as
2c140 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65  sert( !pPage->le
2c150 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 73 71  afData );.    sq
2c160 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d  lite3BtreeGetTem
2c170 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c  pCursor(pCur, &l
2c180 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20  eafCur);.    rc 
2c190 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
2c1a0 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f  xt(&leafCur, &no
2c1b0 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
2c1c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c1d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c1e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 6c 65  te3PagerWrite(le
2c1f0 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 44 62  afCur.pPage->pDb
2c200 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2c210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 52 41 43  OK ){.      TRAC
2c230 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2c240 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
2c250 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
2c260 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
2c270 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
2c280 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c290 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66  Page->pgno, leaf
2c2a0 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29  Cur.pPage->pgno)
2c2b0 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  );.      dropCel
2c2c0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2c2d0 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2c2e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2c2f0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69        pNext = fi
2c300 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  ndCell(leafCur.p
2c310 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2c320 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74  x);.      szNext
2c330 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c   = cellSizePtr(l
2c340 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e  eafCur.pPage, pN
2c350 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
2c360 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
2c370 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
2c380 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c  );.      tempCel
2c390 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
2c3a0 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  oc( MX_CELL_SIZE
2c3b0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69  (pBt) );.      i
2c3c0 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2c3d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2c3e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c3f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2c400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c410 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
2c420 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
2c430 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78   pCur->idx, pNex
2c440 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74  t-4, szNext+4, t
2c450 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20  empCell, 0);.   
2c460 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2c470 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c480 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2c490 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
2c4a0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70  e, pCur->idx), p
2c4b0 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  gnoChild);.     
2c4c0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2c4d0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  age, 0);.    }. 
2c4e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72  E_OK ){.      dr
2c500 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  opCell(leafCur.p
2c510 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2c520 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  x, szNext);.    
2c530 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c    rc = balance(l
2c540 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29  eafCur.pPage, 0)
2c550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2c560 74 65 33 5f 66 72 65 65 28 74 65 6d 70 43 65 6c  te3_free(tempCel
2c570 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l);.    sqlite3B
2c580 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
2c590 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2c5a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2c5b0 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2c5c0 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2c5d0 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2c5e0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2c5f0 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2c600 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2c610 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2c620 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2c630 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2c640 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c650 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pPage, 0);.  }.
2c660 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c670 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2c680 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2c690 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c6a0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2c6b0 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
2c6c0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2c6d0 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
2c6e0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2c6f0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2c700 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
2c710 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
2c720 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
2c730 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
2c740 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
2c750 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
2c760 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
2c770 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2c780 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
2c790 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
2c7a0 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
2c7b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
2c7c0 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
2c7d0 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
2c7e0 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
2c7f0 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
2c800 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
2c810 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
2c820 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
2c830 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
2c840 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
2c850 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2c860 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2c870 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2c880 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2c890 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
2c8a0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
2c8b0 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
2c8c0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2c8d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2c8e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2c8f0 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2c900 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2c910 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2c920 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2c930 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a  action first */.
2c940 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2c950 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2c960 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2c970 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2c980 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2c990 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2c9a0 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
2c9b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2c9c0 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
2c9d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2c9e0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2c9f0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2ca00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2ca10 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2ca20 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
2ca30 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2ca40 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
2ca50 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
2ca60 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
2ca70 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
2ca80 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
2ca90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
2caa0 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
2cab0 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
2cac0 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
2cad0 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
2cae0 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
2caf0 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
2cb00 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
2cb10 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
2cb20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
2cb30 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
2cb40 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
2cb50 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
2cb60 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
2cb70 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
2cb80 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
2cb90 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
2cba0 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
2cbb0 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
2cbc0 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
2cbd0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
2cbe0 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
2cbf0 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
2cc00 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
2cc10 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
2cc20 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
2cc30 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
2cc40 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2cc50 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
2cc60 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
2cc70 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2cc80 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
2cc90 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
2cca0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
2ccb0 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
2ccc0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2ccd0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2cce0 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
2ccf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cd00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cd10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2cd20 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
2cd30 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
2cd40 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
2cd50 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
2cd60 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
2cd70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
2cd80 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2cd90 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
2cda0 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d     if( pgnoRoot=
2cdb0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2cdc0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
2cdd0 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
2cde0 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
2cdf0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
2ce00 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
2ce10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2ce20 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
2ce30 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
2ce40 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
2ce50 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
2ce60 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
2ce70 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
2ce80 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
2ce90 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2cea0 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
2ceb0 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
2cec0 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
2ced0 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
2cee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2cef0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2cf00 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
2cf10 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
2cf20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
2cf30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cf40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2cf50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2cf60 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
2cf70 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
2cf80 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69     /* pgnoRoot i
2cf90 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
2cfa0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
2cfb0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
2cfc0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  f.      ** the n
2cfd0 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69  ew table (assumi
2cfe0 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  ng an error did 
2cff0 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20  not occur). But 
2d000 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a  we were.      **
2d010 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d   allocated pgnoM
2d020 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64  ove. If required
2d030 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73   (i.e. if it was
2d040 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20   not allocated. 
2d050 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e       ** by exten
2d060 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20  ding the file), 
2d070 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2d080 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e   at position pgn
2d090 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69  oMove.      ** i
2d0a0 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61  s already journa
2d0b0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
2d0c0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2d0d0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
2d0e0 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e;..      releas
2d0f0 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29  ePage(pPageMove)
2d100 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ;..      /* Move
2d110 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
2d120 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  tly at pgnoRoot 
2d130 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a  to pgnoMove. */.
2d140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d150 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2d160 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2d170 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
2d180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d190 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2d1a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2d1b0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2d1c0 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pGet(pBt, pgnoRo
2d1d0 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  ot, &eType, &iPt
2d1e0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  rPage);.      if
2d1f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d200 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2d210 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79  _ROOTPAGE || eTy
2d220 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2d230 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  AGE ){.        r
2d240 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d250 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d260 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2d270 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2d280 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
2d290 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
2d2a0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
2d2b0 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20  P_FREEPAGE );.  
2d2c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d2d0 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
2d2e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2d2f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2d310 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d320 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d330 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2d340 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
2d350 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74  ePage(pBt, pRoot
2d360 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
2d370 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20  e, pgnoMove);.  
2d380 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2d390 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
2d3a0 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
2d3b0 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
2d3c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d3d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d3e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2d400 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2d410 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2d420 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2d430 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2d470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d480 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
2d490 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2d4a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d4b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d4c0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2d4d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d4e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2d4f0 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
2d500 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
2d510 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
2d520 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2d530 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
2d540 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
2d550 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
2d560 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2d570 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
2d580 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
2d590 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
2d5a0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2d5b0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2d5c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d5d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2d5e0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2d5f0 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
2d600 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2d610 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2d620 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2d630 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d640 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
2d650 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2d660 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2d670 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2d680 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
2d690 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2d6a0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
2d6b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2d6c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2d6d0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
2d6e0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
2d6f0 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
2d700 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
2d710 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
2d720 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
2d730 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
2d740 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
2d750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
2d760 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2d770 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2d780 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2d790 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2d7a0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2d7b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2d7c0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
2d7d0 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
2d7e0 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
2d7f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2d800 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2d810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2d820 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
2d830 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
2d840 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
2d850 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
2d860 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
2d870 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
2d880 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
2d890 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
2d8a0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
2d8b0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
2d8c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
2d8d0 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
2d8e0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
2d8f0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
2d900 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d  o clear */.  Mem
2d910 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
2d920 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2d930 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65  e.  NULL for the
2d940 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66   root */.  int f
2d950 72 65 65 50 61 67 65 46 6c 61 67 20 20 20 20 20  reePageFlag     
2d960 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70   /* Deallocate p
2d970 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  age if true */.)
2d980 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2d990 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
2d9a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2d9b0 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2d9c0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
2d9d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d9e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2d9f0 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74    if( pgno>sqlit
2da00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2da10 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
2da20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2da30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2da40 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
2da50 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2da60 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70   pgno, &pPage, p
2da70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
2da80 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2da90 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2daa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2dab0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
2dac0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2dad0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2dae0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2daf0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2db00 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2db10 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2db20 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67  yte(pCell), pPag
2db30 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2db40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2db50 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2db60 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2db70 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2db80 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2db90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2dba0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2dbb0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
2dbc0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2dbd0 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  af ){.    rc = c
2dbe0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2dbf0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
2dc00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29  pPage->aData[8])
2dc10 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2dc20 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
2dc30 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2dc40 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2dc50 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
2dc60 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
2dc70 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2dc80 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
2dc90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2dca0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2dcb0 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20  bPage))==0 ){.  
2dcc0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2dcd0 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
2dce0 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ] | PTF_LEAF);. 
2dcf0 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73   }..cleardatabas
2dd00 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c  epage_out:.  rel
2dd10 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2dd20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dd30 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
2dd40 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  l information fr
2dd50 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  om a single tabl
2dd60 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2dd70 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a  e.  iTable is.**
2dd80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2dd90 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   of the root of 
2dda0 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65  the table.  Afte
2ddb0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
2ddc0 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72  eturns,.** the r
2ddd0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2dde0 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69  y, but still exi
2ddf0 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sts..**.** This 
2de00 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
2de10 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
2de20 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
2de30 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65  e any open.** re
2de40 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
2de50 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77  e table.  Open w
2de60 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
2de70 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
2de80 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2de90 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
2dea0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
2deb0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2dec0 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72  iTable){.  int r
2ded0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
2dee0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
2def0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2df00 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  (p);.  if( p->in
2df10 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2df20 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  TE ){.    rc = p
2df30 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2df40 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2df50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2df60 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
2df70 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2df80 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 21 3d  p, iTable, 0))!=
2df90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dfa0 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
2dfb0 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  o */.  }else if(
2dfc0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2dfd0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2dfe0 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29  (pBt, iTable, 0)
2dff0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68  ) ){.    /* noth
2e000 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d  ing to do */.  }
2e010 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63  else{.    rc = c
2e020 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2e030 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2e040 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  le, 0, 0);.  }. 
2e050 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2e060 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2e070 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
2e080 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  se all informati
2e090 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e  on in a table an
2e0a0 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f  d add the root o
2e0b0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a  f the table to.*
2e0c0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  * the freelist. 
2e0d0 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f   Except, the roo
2e0e0 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70  t of the princip
2e0f0 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e  le table (the on
2e100 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20  e on.** page 1) 
2e110 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74  is never added t
2e120 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
2e130 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e140 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
2e150 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
2e160 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2e170 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73   open.** cursors
2e180 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   on the table..*
2e190 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
2e1a0 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e  UM is enabled an
2e1b0 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54  d the page at iT
2e1c0 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20  able is not the 
2e1d0 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67  last.** root pag
2e1e0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2e1f0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
2e200 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
2e210 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
2e220 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65  ase file is move
2e230 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20  d into the slot 
2e240 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2e250 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61  d by.** iTable a
2e260 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f  nd that last slo
2e270 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
2e280 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20  ied by the last 
2e290 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
2e2a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2e2b0 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66  elist instead of
2e2c0 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69   iTable.  In thi
2e2d0 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f  s say, all.** ro
2e2e0 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70  ot pages are kep
2e2f0 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  t at the beginni
2e300 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
2e310 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a  se file, which.*
2e320 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  * is necessary f
2e330 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f  or AUTOVACUUM to
2e340 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70   work right.  *p
2e350 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2e360 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75   the .** page nu
2e370 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74  mber that used t
2e380 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f  o be the last ro
2e390 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  ot page in the f
2e3a0 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ile before.** th
2e3b0 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70  e move.  If no p
2e3c0 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20  age gets moved, 
2e3d0 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
2e3e0 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  to 0..** The las
2e3f0 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72  t root page is r
2e400 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b  ecorded in meta[
2e410 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  3] and the value
2e420 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69   of.** meta[3] i
2e430 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69  s updated by thi
2e440 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a  s procedure..*/.
2e450 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2e460 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
2e470 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
2e480 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20  int *piMoved){. 
2e490 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2e4a0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2e4b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2e4c0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
2e4d0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2e4e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2e4f0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2e500 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2e510 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
2e520 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2e530 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2e540 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2e550 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
2e560 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74  egal to drop a t
2e570 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73  able if any curs
2e580 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  ors are open on 
2e590 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
2e5a0 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  e. This is becau
2e5b0 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
2e5c0 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65  m mode the backe
2e5d0 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64  nd may.  ** need
2e5e0 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72   to move another
2e5f0 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69   root-page to fi
2e600 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79  ll a gap left by
2e610 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a   the deleted.  *
2e620 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20  * root page. If 
2e630 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
2e640 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61  as using this pa
2e650 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75  ge a problem wou
2e660 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a  ld .  ** occur..
2e670 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2e680 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
2e690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2e6a0 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KED;.  }..  rc =
2e6b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2e6c0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
2e6d0 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20  iTable, &pPage, 
2e6e0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2e6f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
2e700 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2e710 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  arTable(p, iTabl
2e720 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
2e730 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e740 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
2e750 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rn rc;.  }..  *p
2e760 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69  iMoved = 0;..  i
2e770 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23  f( iTable>1 ){.#
2e780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2e790 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2e7a0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2e7b0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Page);.    relea
2e7c0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23  sePage(pPage);.#
2e7d0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74  else.    if( pBt
2e7e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2e7f0 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f        Pgno maxRo
2e800 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63  otPgno;.      rc
2e810 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2e820 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61  etMeta(p, 4, &ma
2e830 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2e840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2e860 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2e870 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2e880 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2e890 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
2e8a0 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
2e8b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2e8c0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
2e8d0 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
2e8e0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
2e8f0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2e900 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2e910 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
2e920 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
2e930 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
2e940 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
2e950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2e960 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2e970 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2e980 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2e990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e9a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e9b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2e9d0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2e9e0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2e9f0 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
2ea00 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
2ea10 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
2ea20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
2ea30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
2ea40 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
2ea50 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
2ea60 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
2ea70 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
2ea80 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
2ea90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2eaa0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
2eab0 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
2eac0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2ead0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2eae0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2eaf0 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
2eb00 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
2eb10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2eb20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2eb40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eb50 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
2eb60 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
2eb70 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2eb80 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  , 0, iTable);.  
2eb90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2eba0 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2ebb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ebc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ebd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ebe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2ebf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2ec00 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
2ec10 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
2ec20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2ec30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ec40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2ec50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2ec60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2ec70 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  eePage(pMove);. 
2ec80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2ec90 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2eca0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ecb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ecc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ecd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
2ece0 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f  piMoved = maxRoo
2ecf0 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPgno;.      }..
2ed00 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
2ed10 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70   new 'max-root-p
2ed20 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68  age' value in th
2ed30 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
2ed40 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  r. This.      **
2ed50 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75   is the old valu
2ed60 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73  e less one, less
2ed70 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61   one more if tha
2ed80 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20  t happens to.   
2ed90 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d     ** be a root-
2eda0 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73  page number, les
2edb0 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74  s one again if t
2edc0 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20  hat is the.     
2edd0 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2ede0 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a  _PAGE..      */.
2edf0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2ee00 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  o--;.      if( m
2ee10 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44  axRootPgno==PEND
2ee20 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ee30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  t) ){.        ma
2ee40 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
2ee50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
2ee60 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d  axRootPgno==PTRM
2ee70 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d  AP_PAGENO(pBt, m
2ee80 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20  axRootPgno) ){. 
2ee90 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
2eea0 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
2eeb0 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52      assert( maxR
2eec0 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47  ootPgno!=PENDING
2eed0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2eee0 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  );..      rc = s
2eef0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2ef00 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52  eMeta(p, 4, maxR
2ef10 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  ootPgno);.    }e
2ef20 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2ef30 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2ef40 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2ef50 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
2ef60 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
2ef70 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  .    /* If sqlit
2ef80 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
2ef90 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70   was called on p
2efa0 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65  age 1. */.    ze
2efb0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54  roPage(pPage, PT
2efc0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2efd0 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  F );.    release
2efe0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2eff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
2f000 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2f010 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
2f020 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2f030 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
2f040 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
2f050 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
2f060 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44  );.  rc = btreeD
2f070 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62  ropTable(p, iTab
2f080 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20  le, piMoved);.  
2f090 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2f0a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2f0b0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
2f0c0 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72  d the meta-infor
2f0d0 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20  mation out of a 
2f0e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2f0f0 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68  Meta[0].** is th
2f100 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
2f110 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
2f120 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f130 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68  .  Meta[1].** th
2f140 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61  rough meta[15] a
2f150 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  re available for
2f160 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c   use by higher l
2f170 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a  ayers.  Meta[0].
2f180 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  ** is read-only,
2f190 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20   the others are 
2f1a0 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a  read/write..** .
2f1b0 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61  ** The schema la
2f1c0 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61  yer numbers meta
2f1d0 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e   values differen
2f1e0 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68  tly.  At the sch
2f1f0 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e  ema.** layer (an
2f200 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20  d the SetCookie 
2f210 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f  and ReadCookie o
2f220 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62  pcodes) the numb
2f230 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61  er of.** free pa
2f240 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62  ges is not visib
2f250 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30  le.  So Cookie[0
2f260 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  ] is the same as
2f270 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74   Meta[1]..*/.int
2f280 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f290 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
2f2a0 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65  nt idx, u32 *pMe
2f2b0 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  ta){.  DbPage *p
2f2c0 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  DbPage;.  int rc
2f2d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2f2e0 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72  r *pP1;.  BtShar
2f2f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2f300 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
2f310 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 2f 2a  eEnter(p);..  /*
2f320 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
2f330 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
2f340 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
2f350 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
2f360 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
2f370 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2f380 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
2f390 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
2f3a0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
2f3b0 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
2f3c0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2f3d0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
2f3e0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2f3f0 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
2f400 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
2f410 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
2f420 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
2f430 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
2f440 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
2f450 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
2f460 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
2f470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f480 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2f490 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2f4a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f4b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
2f4c0 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
2f4d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2f4e0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
2f4f0 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61  Pager, 1, &pDbPa
2f500 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ge);.  if( rc ){
2f510 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2f520 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
2f530 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2f540 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
2f550 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
2f560 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
2f570 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20  ge);.  *pMeta = 
2f580 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  get4byte(&pP1[36
2f590 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71   + idx*4]);.  sq
2f5a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2f5b0 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  pDbPage);..  /* 
2f5c0 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  If autovacuumed 
2f5d0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
2f5e0 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65  his build but we
2f5f0 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a   are trying to .
2f600 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61    ** access an a
2f610 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61  utovacuumed data
2f620 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  base, then make 
2f630 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61  the database rea
2f640 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66  donly. .  */.#if
2f650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f660 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
2f670 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74   idx==4 && *pMet
2f680 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f  a>0 ) pBt->readO
2f690 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  nly = 1;.#endif.
2f6a0 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72  .  /* Grab the r
2f6b0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ead-lock on page
2f6c0 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f   1. */.  rc = lo
2f6d0 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45  ckTable(p, 1, RE
2f6e0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69  AD_LOCK);.  sqli
2f6f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2f700 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f710 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65  ../*.** Write me
2f720 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62  ta-information b
2f730 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
2f740 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20  abase.  Meta[0] 
2f750 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20  is.** read-only 
2f760 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  and may not be w
2f770 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ritten..*/.int s
2f780 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2f790 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  eMeta(Btree *p, 
2f7a0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65  int idx, u32 iMe
2f7b0 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ta){.  BtShared 
2f7c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2f7d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f7e0 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pP1;.  int rc;. 
2f7f0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20   assert( idx>=1 
2f800 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2f810 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2f820 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  r(p);.  if( p->i
2f830 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
2f840 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
2f850 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2f860 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2f870 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2f880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2f890 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
2f8a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20 3d  !=0 );.    pP1 =
2f8b0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
2f8c0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ata;.    rc = sq
2f8d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f8e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
2f8f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2f900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f910 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f920 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c  pP1[36 + idx*4],
2f930 20 69 4d 65 74 61 29 3b 0a 20 20 20 20 20 20 69   iMeta);.      i
2f940 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20  f( idx==7 ){.   
2f950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2f960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20  ->autoVacuum || 
2f970 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  iMeta==0 );.    
2f980 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74      assert( iMet
2f990 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31  a==0 || iMeta==1
2f9a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2f9b0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 4d  >incrVacuum = iM
2f9c0 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eta;.      }.   
2f9d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2f9e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2f9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fa00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2fa10 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
2fa20 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2fa30 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
2fa40 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
2fa50 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
2fa60 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
2fa70 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
2fa80 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2fa90 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
2faa0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
2fab0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
2fac0 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
2fad0 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
2fae0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2faf0 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
2fb00 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2fb10 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2fb20 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
2fb30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2fb40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2fb50 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75   pPage->pBt==pCu
2fb60 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75  r->pBt );.  retu
2fb70 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65  rn pPage ? pPage
2fb80 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2fb90 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d  drOffset] : 0;.}
2fba0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2fbb0 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
2fbc0 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65  ated with a BTre
2fbd0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2fbe0 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
2fbf0 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2fc00 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50  gging only..*/.P
2fc10 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72  ager *sqlite3Btr
2fc20 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70  eePager(Btree *p
2fc30 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
2fc40 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23  Bt->pPager;.}..#
2fc50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fc60 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2fc70 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  CK./*.** Append 
2fc80 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  a message to the
2fc90 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
2fca0 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
2fcb0 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e   void checkAppen
2fcc0 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74  dMsg(.  Integrit
2fcd0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63  yCk *pCheck,.  c
2fce0 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f  har *zMsg1,.  co
2fcf0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2fd00 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61  t,.  ....){.  va
2fd10 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
2fd20 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21   *zMsg2;.  if( !
2fd30 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20  pCheck->mxErr ) 
2fd40 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b  return;.  pCheck
2fd50 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68  ->mxErr--;.  pCh
2fd60 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76  eck->nErr++;.  v
2fd70 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
2fd80 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20  mat);.  zMsg2 = 
2fd90 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
2fda0 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  0, zFormat, ap);
2fdb0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2fdc0 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20   if( zMsg1==0 ) 
2fdd0 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66  zMsg1 = "";.  if
2fde0 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  ( pCheck->zErrMs
2fdf0 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  g ){.    char *z
2fe00 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45  Old = pCheck->zE
2fe10 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63  rrMsg;.    pChec
2fe20 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  k->zErrMsg = 0;.
2fe30 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2fe40 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45  ring(&pCheck->zE
2fe50 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e  rrMsg, zOld, "\n
2fe60 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  ", zMsg1, zMsg2,
2fe70 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2fe80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
2fe90 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
2fea0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
2feb0 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  g(&pCheck->zErrM
2fec0 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32  sg, zMsg1, zMsg2
2fed0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d  , (char*)0);.  }
2fee0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2fef0 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66  zMsg2);.}.#endif
2ff00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2ff10 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
2ff20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2ff30 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2ff40 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64  Y_CHECK./*.** Ad
2ff50 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72  d 1 to the refer
2ff60 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
2ff70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74  age iPage.  If t
2ff80 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
2ff90 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  d.** reference t
2ffa0 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20  o the page, add 
2ffb0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2ffc0 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72   to pCheck->zErr
2ffd0 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  Msg..** Return 1
2ffe0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20   if there are 2 
2fff0 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e  ore more referen
30000 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
30010 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74  and 0 if.** if t
30020 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
30030 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
30040 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e page..**.** Al
30050 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  so check that th
30060 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
30070 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73   in bounds..*/.s
30080 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
30090 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  ef(IntegrityCk *
300a0 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67  pCheck, int iPag
300b0 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
300c0 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
300d0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
300e0 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
300f0 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67  k->nPage || iPag
30100 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  e<0 ){.    check
30110 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30120 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
30130 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
30140 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
30150 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
30160 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
30170 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
30180 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
30190 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
301a0 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
301b0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
301c0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
301d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
301e0 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
301f0 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
30200 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
30210 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30220 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
30230 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
30240 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
30250 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
30260 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
30270 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
30280 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
30290 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
302a0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
302b0 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
302c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
302d0 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
302e0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
302f0 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
30300 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
30310 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
30320 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
30330 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
30340 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
30350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30360 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
30370 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
30380 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
30390 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
303a0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
303b0 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
303c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
303d0 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
303e0 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
303f0 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
30400 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
30410 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
30420 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
30430 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
30440 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
30450 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
30460 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
30470 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
30480 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
30490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
304a0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
304b0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
304c0 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65  t, "Failed to re
304d0 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64  ad ptrmap key=%d
304e0 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ", iChild);.    
304f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
30500 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d  f( ePtrmapType!=
30510 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70  eType || iPtrmap
30520 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20  Parent!=iParent 
30530 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
30540 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
30550 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22  ontext, .      "
30560 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72  Bad ptr map entr
30570 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65  y key=%d expecte
30580 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25  d=(%d,%d) got=(%
30590 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69  d,%d)", .      i
305a0 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50  Child, eType, iP
305b0 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79  arent, ePtrmapTy
305c0 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e  pe, iPtrmapParen
305d0 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
305e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
305f0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
30600 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f  he freelist or o
30610 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
30620 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69  ge list..** Veri
30630 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
30640 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
30650 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f  he list is N..*/
30660 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
30670 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72  ckList(.  Integr
30680 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
30690 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
306a0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  cking context */
306b0 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73  .  int isFreeLis
306c0 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t,       /* True
306d0 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e   for a freelist.
306e0 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72    False for over
306f0 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a  flow page list *
30700 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
30710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30720 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  e number for fir
30730 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  st page in the l
30740 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ist */.  int N, 
30750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30760 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
30770 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
30780 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  e list */.  char
30790 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
307a0 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
307b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
307c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
307d0 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20   int expected = 
307e0 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  N;.  int iFirst 
307f0 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65  = iPage;.  while
30800 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68  ( N-- > 0 && pCh
30810 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20  eck->mxErr ){.  
30820 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50    DbPage *pOvflP
30830 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  age;.    unsigne
30840 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74  d char *pOvflDat
30850 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  a;.    if( iPage
30860 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  <1 ){.      chec
30870 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30880 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
30890 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20        "%d of %d 
308a0 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72  pages missing fr
308b0 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  om overflow list
308c0 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22   starting at %d"
308d0 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c  ,.          N+1,
308e0 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73   expected, iFirs
308f0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
30900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
30910 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
30920 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
30930 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
30940 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
30950 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72  t(pCheck->pPager
30960 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
30970 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20  pOvflPage) ){.  
30980 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30990 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
309a0 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ext, "failed to 
309b0 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50  get page %d", iP
309c0 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  age);.      brea
309d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76  k;.    }.    pOv
309e0 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e  flData = (unsign
309f0 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
30a00 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f  3PagerGetData(pO
30a10 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66  vflPage);.    if
30a20 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a  ( isFreeList ){.
30a30 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65        int n = ge
30a40 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
30a50 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  a[4]);.#ifndef S
30a60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30a70 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
30a80 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
30a90 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30aa0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
30ab0 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54  Check, iPage, PT
30ac0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
30ad0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
30ae0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
30af0 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e    if( n>pCheck->
30b00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
30b10 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63  4-8 ){.        c
30b20 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
30b30 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
30b40 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65             "free
30b50 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20  list leaf count 
30b60 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20  too big on page 
30b70 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30b80 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20       N--;.      
30b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
30ba0 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
30bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  ){.          Pgn
30bc0 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65  o iFreePage = ge
30bd0 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
30be0 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64  a[8+i*4]);.#ifnd
30bf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
30c00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
30c10 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
30c20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
30c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
30c40 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
30c50 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54  k, iFreePage, PT
30c60 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
30c70 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
30c80 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
30c90 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52            checkR
30ca0 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ef(pCheck, iFree
30cb0 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
30cc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30cd0 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20     N -= n;.     
30ce0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
30cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30d00 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65  OVACUUM.    else
30d10 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
30d20 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70  is database supp
30d30 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
30d40 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f   and iPage is no
30d50 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  t the last.     
30d60 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
30d70 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20   overflow list, 
30d80 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
30d90 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
30da0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
30db0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65  e following page
30dc0 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a   matches iPage..
30dd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
30de0 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
30df0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e  autoVacuum && N>
30e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
30e10 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
30e20 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ata);.        ch
30e30 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
30e40 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
30e50 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
30e60 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
30e70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30e80 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
30e90 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
30ea0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
30eb0 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b  nref(pOvflPage);
30ec0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
30ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
30ee0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
30ef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30f00 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
30f10 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61  HECK./*.** Do va
30f20 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65  rious sanity che
30f30 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  cks on a single 
30f40 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20  page of a tree. 
30f50 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74   Return.** the t
30f60 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74  ree depth.  Root
30f70 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e   pages return 0.
30f80 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f    Parents of roo
30f90 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72  t pages.** retur
30fa0 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  n 1, and so fort
30fb0 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20  h..** .** These 
30fc0 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a  checks are done:
30fd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20  .**.**      1.  
30fe0 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63  Make sure that c
30ff0 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f  ells and freeblo
31000 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c  cks do not overl
31010 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62  ap.**          b
31020 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f  ut combine to co
31030 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74  mpletely cover t
31040 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20  he page..**  NO 
31050 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63   2.  Make sure c
31060 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20  ell keys are in 
31070 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33  order..**  NO  3
31080 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
31090 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  key is less than
310a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f   or equal to zLo
310b0 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f  werBound..**  NO
310c0 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    4.  Make sure 
310d0 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65  no key is greate
310e0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
310f0 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a  to zUpperBound..
31100 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63  **      5.  Chec
31110 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
31120 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
31130 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52  s..**      6.  R
31140 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20  ecursively call 
31150 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e  checkTreePage on
31160 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a   all children..*
31170 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66  *      7.  Verif
31180 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68  y that the depth
31190 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
311a0 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a   is the same..**
311b0 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73        8.  Make s
311c0 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73  ure this page is
311d0 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75   at least 33% fu
311e0 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  ll or else it is
311f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65  .**          the
31200 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
31210 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31220 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a   checkTreePage(.
31230 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
31240 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65  Check,  /* Conte
31250 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74  xt for the sanit
31260 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  y check */.  int
31270 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
31280 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31290 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
312a0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50   check */.  MemP
312b0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
312c0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
312d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72   */.  char *zPar
312e0 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50  entContext  /* P
312f0 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f  arent context */
31300 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
31310 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72  Page;.  int i, r
31320 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67  c, depth, d2, pg
31330 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68  no, cnt;.  int h
31340 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20  dr, cellStart;. 
31350 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38   int nCell;.  u8
31360 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72   *data;.  BtShar
31370 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75  ed *pBt;.  int u
31380 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61  sableSize;.  cha
31390 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b  r zContext[100];
313a0 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20  .  char *hit;.. 
313b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
313c0 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
313d0 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50  t), zContext, "P
313e0 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
313f0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
31400 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
31410 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
31420 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
31430 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
31440 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
31450 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
31460 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
31470 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
31480 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
31490 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
314a0 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73  0;.  if( (rc = s
314b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
314c0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
314d0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
314e0 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
314f0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31500 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
31510 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65     "unable to ge
31520 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f  t the page. erro
31530 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b  r code=%d", rc);
31540 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31550 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73   }.  if( (rc = s
31560 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
31570 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
31580 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt))!=0 ){.    c
31590 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
315a0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
315b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
315c0 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65      "sqlite3Btre
315d0 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  eInitPage() retu
315e0 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
315f0 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
31600 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31610 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31620 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
31630 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
31640 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
31650 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
31660 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
31670 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
31680 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
31690 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
316a0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
316b0 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
316c0 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
316d0 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
316e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
316f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
31700 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
31710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f  .             "O
31720 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
31730 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
31740 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
31750 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31760 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,i);.    sqlite3
31770 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
31780 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
31790 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
317a0 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
317b0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
317c0 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f  Key ) sz += info
317d0 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72  .nKey;.    asser
317e0 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79  t( sz==info.nPay
317f0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20  load );.    if( 
31800 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  sz>info.nLocal )
31810 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
31820 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e  e = (sz - info.n
31830 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69  Local + usableSi
31840 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53  ze - 5)/(usableS
31850 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ize - 4);.      
31860 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
31870 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
31880 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
31890 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
318a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
318b0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
318c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
318d0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
318e0 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76  p(pCheck, pgnoOv
318f0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
31900 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW1, iPage, zCo
31910 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
31920 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65  #endif.      che
31930 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30  ckList(pCheck, 0
31940 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67  , pgnoOvfl, nPag
31950 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31960 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
31970 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74  k sanity of left
31980 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
31990 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
319a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
319b0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
319c0 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  e(pCell);.#ifnde
319d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
319e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
319f0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31a00 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
31a10 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31a20 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
31a30 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f  TREE, iPage, zCo
31a40 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
31a50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20  #endif.      d2 
31a60 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  = checkTreePage(
31a70 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67  pCheck,pgno,pPag
31a80 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e,zContext);.   
31a90 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
31aa0 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
31ab0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31ac0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31ad0 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
31ae0 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
31af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
31b00 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
31b10 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
31b20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
31b30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
31b40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
31b50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
31b60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
31b70 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
31b80 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
31b90 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
31ba0 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61            "On pa
31bb0 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
31bc0 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
31bd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31be0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31bf0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
31c00 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
31c10 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
31c20 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
31c30 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
31c40 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
31c50 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
31c60 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
31c70 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   pPage, zContext
31c80 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68  );.  }. .  /* Ch
31c90 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65  eck for complete
31ca0 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65   coverage of the
31cb0 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74   page.  */.  dat
31cc0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
31cd0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
31ce0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69  >hdrOffset;.  hi
31cf0 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
31d00 63 5a 65 72 6f 28 20 75 73 61 62 6c 65 53 69 7a  cZero( usableSiz
31d10 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29  e );.  if( hit )
31d20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  {.    memset(hit
31d30 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64  , 1, get2byte(&d
31d40 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20  ata[hdr+5]));.  
31d50 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
31d60 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
31d70 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20  ;.    cellStart 
31d80 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
31d90 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
31da0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
31db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
31dc0 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
31dd0 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b  &data[cellStart+
31de0 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i*2]);.      int
31df0 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
31e00 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
31e10 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  [pc]);.      int
31e20 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   j;.      if( (p
31e30 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  c+size-1)>=usabl
31e40 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b  eSize || pc<0 ){
31e50 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
31e60 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31e70 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
31e80 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
31e90 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
31ea0 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
31eb0 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
31ec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
31ed0 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e  (j=pc+size-1; j>
31ee0 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  =pc; j--) hit[j]
31ef0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
31f00 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c  }.    for(cnt=0,
31f10 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74   i=get2byte(&dat
31f20 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26  a[hdr+1]); i>0 &
31f30 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26  & i<usableSize &
31f40 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20  & cnt<10000; .  
31f50 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b           cnt++){
31f60 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
31f70 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
31f80 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  [i+2]);.      in
31f90 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
31fa0 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  i+size-1)>=usabl
31fb0 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a  eSize || i<0 ){.
31fc0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
31fd0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
31fe0 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
31ff0 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
32000 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
32010 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
32020 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
32030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
32040 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  (j=i+size-1; j>=
32050 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  i; j--) hit[j]++
32060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32070 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  i = get2byte(&da
32080 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ta[i]);.    }.  
32090 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69    for(i=cnt=0; i
320a0 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b  <usableSize; i++
320b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74  ){.      if( hit
320c0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
320d0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d    cnt++;.      }
320e0 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e  else if( hit[i]>
320f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  1 ){.        che
32100 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32110 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ck, 0,.         
32120 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20   "Multiple uses 
32130 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70  for byte %d of p
32140 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67  age %d", i, iPag
32150 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
32160 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
32170 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61  .    if( cnt!=da
32180 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20  ta[hdr+7] ){.   
32190 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
321a0 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
321b0 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e          "Fragmen
321c0 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20  ted space is %d 
321d0 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73  byte reported as
321e0 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
321f0 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20  .          cnt, 
32200 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61  data[hdr+7], iPa
32210 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
32220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69   sqlite3_free(hi
32230 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61  t);..  releasePa
32240 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
32250 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23  urn depth+1;.}.#
32260 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32270 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
32280 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
32290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
322a0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
322b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
322c0 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  does a complete 
322d0 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76  check of the giv
322e0 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20  en BTree file.  
322f0 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e  aRoot[] is.** an
32300 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20   array of pages 
32310 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63  numbers were eac
32320 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  h page number is
32330 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
32340 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e  f.** a table.  n
32350 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62  Root is the numb
32360 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
32370 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   aRoot..**.** If
32380 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63   everything chec
32390 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75  ks out, this rou
323a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
323b0 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  L.  If something
323c0 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e   is.** amiss, an
323d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
323e0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  s written into m
323f0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
32400 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  rom malloc().** 
32410 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
32420 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73   that error mess
32430 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
32440 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
32450 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
32460 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
32470 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  eing the error m
32480 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69  essage when it i
32490 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20  s done..*/.char 
324a0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
324b0 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42  egrityCheck(.  B
324c0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20  tree *p,     /* 
324d0 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  The btree to be 
324e0 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
324f0 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e   *aRoot,   /* An
32500 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70   array of root p
32510 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  ages numbers for
32520 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65   individual tree
32530 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  s */.  int nRoot
32540 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
32550 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
32560 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ot[] */.  int mx
32570 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20  Err,    /* Stop 
32580 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73  reporting errors
32590 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79   after this many
325a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72   */.  int *pnErr
325b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d      /* Write num
325c0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
325d0 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  en to this varia
325e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
325f0 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20  i;.  int nRef;. 
32600 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68   IntegrityCk sCh
32610 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  eck;.  BtShared 
32620 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
32630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
32640 74 65 72 28 70 29 3b 0a 20 20 6e 52 65 66 20 3d  ter(p);.  nRef =
32650 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
32660 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
32670 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74  r);.  if( lockBt
32680 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 21  reeWithRetry(p)!
32690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
326a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
326b0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
326c0 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44 75 70  rn sqlite3StrDup
326d0 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75  ("Unable to acqu
326e0 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ire a read lock 
326f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22  on the database"
32700 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  );.  }.  sCheck.
32710 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68  pBt = pBt;.  sCh
32720 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74  eck.pPager = pBt
32730 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65  ->pPager;.  sChe
32740 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  ck.nPage = sqlit
32750 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
32760 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b  (sCheck.pPager);
32770 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20  .  sCheck.mxErr 
32780 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63  = mxErr;.  sChec
32790 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70  k.nErr = 0;.  *p
327a0 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65  nErr = 0;.#ifnde
327b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
327c0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
327d0 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b  Bt->nTrunc!=0 ){
327e0 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  .    sCheck.nPag
327f0 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  e = pBt->nTrunc;
32800 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
32810 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d  ( sCheck.nPage==
32820 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  0 ){.    unlockB
32830 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
32840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
32850 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
32860 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
32870 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20   sCheck.anRef = 
32880 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
32890 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29  (sCheck.nPage+1)
328a0 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61  *sizeof(sCheck.a
328b0 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66  nRef[0]) );.  if
328c0 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  ( !sCheck.anRef 
328d0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
328e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
328f0 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b  .    *pnErr = 1;
32900 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
32910 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
32920 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72  eturn sqlite3MPr
32930 69 6e 74 66 28 70 2d 3e 70 53 71 6c 69 74 65 2c  intf(p->pSqlite,
32940 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c   "Unable to mall
32950 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20  oc %d bytes", . 
32960 20 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e         (sCheck.n
32970 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73  Page+1)*sizeof(s
32980 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29  Check.anRef[0]))
32990 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
329a0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
329b0 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61  ; i++){ sCheck.a
329c0 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20  nRef[i] = 0; }. 
329d0 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54   i = PENDING_BYT
329e0 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69  E_PAGE(pBt);.  i
329f0 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  f( i<=sCheck.nPa
32a00 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b  ge ){.    sCheck
32a10 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20  .anRef[i] = 1;. 
32a20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72   }.  sCheck.zErr
32a30 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  Msg = 0;..  /* C
32a40 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
32a50 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
32a60 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
32a70 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
32a80 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
32a90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32aa0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
32ab0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
32ac0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
32ad0 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
32ae0 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
32af0 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
32b00 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
32b10 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68  ; i<nRoot && sCh
32b20 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
32b30 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69  .    if( aRoot[i
32b40 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
32b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32b60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32b70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
32b80 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74  oVacuum && aRoot
32b90 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63  [i]>1 ){.      c
32ba0 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65  heckPtrmap(&sChe
32bb0 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54  ck, aRoot[i], PT
32bc0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
32bd0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
32be0 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
32bf0 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52  Page(&sCheck, aR
32c00 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74  oot[i], 0, "List
32c10 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20   of tree roots: 
32c20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ");.  }..  /* Ma
32c30 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61  ke sure every pa
32c40 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  ge in the file i
32c50 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a  s referenced.  *
32c60 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  /.  for(i=1; i<=
32c70 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20  sCheck.nPage && 
32c80 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
32c90 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
32ca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32cb0 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  M.    if( sCheck
32cc0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a  .anRef[i]==0 ){.
32cd0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32ce0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
32cf0 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
32d00 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
32d10 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
32d20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32d30 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
32d40 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65  acuum, make sure
32d50 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61   no tables conta
32d60 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  in.    ** refere
32d70 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d  nces to pointer-
32d80 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a  map pages..    *
32d90 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  /.    if( sCheck
32da0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20  .anRef[i]==0 && 
32db0 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
32dc0 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d  PAGENO(pBt, i)!=
32dd0 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56  i || !pBt->autoV
32de0 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
32df0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
32e00 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
32e10 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
32e20 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  d", i);.    }.  
32e30 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
32e40 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20  ef[i]!=0 && .   
32e50 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
32e60 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26  NO(pBt, i)==i &&
32e70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32e80 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
32e90 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
32ea0 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d  k, 0, "Pointer m
32eb0 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65  ap page %d is re
32ec0 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20  ferenced", i);. 
32ed0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
32ee0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
32ef0 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69  this analysis di
32f00 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20  d not leave any 
32f10 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20  unref() pages.  
32f20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  */.  unlockBtree
32f30 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
32f40 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c   if( nRef != sql
32f50 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
32f60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
32f70 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
32f80 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
32f90 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e   .      "Outstan
32fa0 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20  ding page count 
32fb0 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  goes from %d to 
32fc0 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61  %d during this a
32fd0 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20  nalysis",.      
32fe0 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67  nRef, sqlite3Pag
32ff0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
33000 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
33010 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
33020 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
33030 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
33040 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
33050 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
33060 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
33070 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65  .  *pnErr = sChe
33080 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75 72  ck.nErr;.  retur
33090 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67  n sCheck.zErrMsg
330a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
330b0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
330c0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a  ITY_CHECK */../*
330d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
330e0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
330f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
33100 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
33110 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66 69  .** The pager fi
33120 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69  lename is invari
33130 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ant as long as t
33140 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f  he pager is.** o
33150 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66  pen so it is saf
33160 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68  e to access with
33170 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64  out the BtShared
33180 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74   mutex..*/.const
33190 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
331a0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42  reeGetFilename(B
331b0 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
331c0 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
331d0 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
331e0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  n sqlite3PagerFi
331f0 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  lename(p->pBt->p
33200 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
33210 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
33220 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
33230 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
33240 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
33250 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
33260 20 70 61 67 65 72 20 64 69 72 65 63 74 6f 72 79   pager directory
33270 20 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61   name is invaria
33280 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
33290 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
332a0 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
332b0 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
332c0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
332d0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
332e0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
332f0 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72  eeGetDirname(Btr
33300 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
33310 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
33320 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
33330 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
33340 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
33350 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
33360 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
33370 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
33380 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64   file for this d
33390 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74  atabase. The ret
333a0 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
333b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
333c0 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c  the same regardl
333d0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
333e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
333f0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
33400 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ted or not..**.*
33410 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72  * The pager jour
33420 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
33430 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
33440 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
33450 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
33460 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
33470 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
33480 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
33490 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
334a0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
334b0 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  nalname(Btree *p
334c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
334d0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
334e0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
334f0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
33500 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
33510 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  r);.}..#ifndef S
33520 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
33530 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  M./*.** Copy the
33540 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
33550 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74  t of pBtFrom int
33560 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e  o pBtTo.  A tran
33570 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
33580 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f  be active for bo
33590 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  th files..**.** 
335a0 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65  The size of file
335b0 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65 20   pBtFrom may be 
335c0 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20  reduced by this 
335d0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66  operation..** If
335e0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
335f0 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61  rong, the transa
33600 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d  ction on pBtFrom
33610 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
33620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
33630 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72  treeCopyFile(Btr
33640 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a  ee *pTo, Btree *
33650 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63  pFrom){.  int rc
33660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33670 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20 6e  Pgno i, nPage, n
33680 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a 0a  ToPage, iSkip;..
33690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 54    BtShared *pBtT
336a0 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20  o = pTo->pBt;.  
336b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f  BtShared *pBtFro
336c0 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a  m = pFrom->pBt;.
336d0 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72  .  if( pTo->inTr
336e0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
336f0 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61   || pFrom->inTra
33700 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
33710 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33720 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
33730 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75    if( pBtTo->pCu
33740 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53 51  rsor ) return SQ
33750 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54 6f  LITE_BUSY;.  nTo
33760 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
33770 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
33780 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e  To->pPager);.  n
33790 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
337a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
337b0 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20  From->pPager);. 
337c0 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47   iSkip = PENDING
337d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
337e0 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63  );.  for(i=1; rc
337f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
33800 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  <=nPage; i++){. 
33810 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
33820 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  ge;.    if( i==i
33830 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Skip ) continue;
33840 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33850 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f  3PagerGet(pBtFro
33860 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  m->pPager, i, &p
33870 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
33880 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
33890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
338a0 65 72 4f 76 65 72 77 72 69 74 65 28 70 42 74 54  erOverwrite(pBtT
338b0 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 73 71  o->pPager, i, sq
338c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
338d0 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20 20 20  a(pDbPage));.   
338e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
338f0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
33900 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
33910 6c 65 20 69 73 20 73 68 72 69 6e 6b 69 6e 67 2c  le is shrinking,
33920 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20 70 61 67   journal the pag
33930 65 73 20 74 68 61 74 20 61 72 65 20 62 65 69 6e  es that are bein
33940 67 20 74 72 75 6e 63 61 74 65 64 0a 20 20 2a 2a  g truncated.  **
33950 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
33960 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
33970 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   if the commit f
33980 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ails..  */.  for
33990 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d  (i=nPage+1; rc==
339a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
339b0 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  nToPage; i++){. 
339c0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
339d0 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  ge;.    if( i==i
339e0 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Skip ) continue;
339f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33a00 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d  3PagerGet(pBtTo-
33a10 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62  >pPager, i, &pDb
33a20 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33a30 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  c ) break;.    r
33a40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33a50 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
33a60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33a70 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67  DontWrite(pDbPag
33a80 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65 61 68 2e  e);.    /* Yeah.
33a90 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72 64    It seems wierd
33aa0 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69   to call DontWri
33ab0 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65 72  te() right after
33ac0 20 57 72 69 74 65 28 29 2e 20 20 42 75 74 0a 20   Write().  But. 
33ad0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65     ** that is be
33ae0 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20  cause the names 
33af0 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75  of those procedu
33b00 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74  res do not exact
33b10 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65 70 72 65  ly .    ** repre
33b20 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20 64  sent what they d
33b30 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61 6c  o.  Write() real
33b40 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68  ly means "put th
33b50 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20  is page in the. 
33b60 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
33b70 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b 20  ournal and mark 
33b80 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20 74  it as dirty so t
33b90 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 77  hat it will be w
33ba0 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 74 6f  ritten.    ** to
33bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33bc0 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74  le later."  Dont
33bd0 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74  Write() undoes t
33be0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f  he second part o
33bf0 66 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e  f.    ** that an
33c00 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  d prevents the p
33c10 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77  age from being w
33c20 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
33c30 74 61 62 61 73 65 2e 20 20 54 68 65 0a 20 20 20  tabase.  The.   
33c40 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69 6c   ** page is stil
33c50 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  l on the rollbac
33c60 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67  k journal, thoug
33c70 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73 20  h.  And that is 
33c80 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20 2a 2a  the whole.    **
33c90 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 6c   point of this l
33ca0 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70 61 67 65  oop: to put page
33cb0 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  s on the rollbac
33cc0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  k journal. */.  
33cd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33ce0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
33cf0 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20 6e  }.  if( !rc && n
33d00 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a  Page<nToPage ){.
33d10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33d20 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 42  PagerTruncate(pB
33d30 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61  tTo->pPager, nPa
33d40 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
33d50 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
33d60 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
33d70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  To);.  }.  retur
33d80 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
33d90 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69  lite3BtreeCopyFi
33da0 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
33db0 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
33dc0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
33dd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f 29  3BtreeEnter(pTo)
33de0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
33df0 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20  Enter(pFrom);.  
33e00 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46 69  rc = btreeCopyFi
33e10 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a  le(pTo, pFrom);.
33e20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
33e30 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71  ave(pFrom);.  sq
33e40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
33e50 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTo);.  return r
33e60 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
33e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
33e80 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
33e90 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
33ea0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
33eb0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
33ec0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
33ed0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
33ee0 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
33ef0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
33f00 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  _held(p->pSqlite
33f10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
33f20 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
33f30 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
33f40 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ITE));.}../*.** 
33f50 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
33f60 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  if a statement t
33f70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
33f80 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
33f90 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d  ite3BtreeIsInStm
33fa0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  t(Btree *p){.  a
33fb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
33fc0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
33fd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
33fe0 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
33ff0 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
34000 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
34010 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
34020 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
34030 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
34040 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34050 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
34060 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
34070 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
34080 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
34090 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  e->mutex) );.  r
340a0 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
340b0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
340c0 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ONE));.}../*.** 
340d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
340e0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
340f0 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d  to a blob of mem
34100 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
34110 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ith.** a single 
34120 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68  shared-btree. Th
34130 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
34140 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65 20   by client code 
34150 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20  for it's own.** 
34160 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78  purposes (for ex
34170 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20  ample, to store 
34180 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68  a high-level sch
34190 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ema associated w
341a0 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72  ith .** the shar
341b0 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62  ed-btree). The b
341c0 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67  tree layer manag
341d0 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  es reference cou
341e0 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a  nting issues..**
341f0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
34200 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
34210 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74  d on a shared-bt
34220 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65  ree, nBytes byte
34230 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  s of memory.** a
34240 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65  re allocated, ze
34250 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e  roed, and return
34260 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
34270 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73 65  . For each subse
34280 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74  quent .** call t
34290 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65  he nBytes parame
342a0 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61  ter is ignored a
342b0 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
342c0 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a  the same blob.**
342d0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72   of memory retur
342e0 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74  ned. .**.** Just
342f0 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61 72   before the shar
34300 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73  ed-btree is clos
34310 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
34320 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
34330 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e  ** xFree argumen
34340 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72  t when the memor
34350 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73  y allocation was
34360 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64   made is invoked
34370 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62   on the .** blob
34380 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65   of allocated me
34390 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74  mory. This funct
343a0 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ion should not c
343b0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  all sqlite3_free
343c0 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d  ().** on the mem
343d0 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c  ory, the btree l
343e0 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a  ayer does that..
343f0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
34400 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72 65  BtreeSchema(Btre
34410 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73  e *p, int nBytes
34420 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76  , void(*xFree)(v
34430 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61  oid *)){.  BtSha
34440 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
34450 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
34460 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
34470 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29   !pBt->pSchema )
34480 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65  {.    pBt->pSche
34490 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ma = sqlite3Mall
344a0 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b 0a  ocZero(nBytes);.
344b0 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
344c0 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20  hema = xFree;.  
344d0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
344e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
344f0 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b  rn pBt->pSchema;
34500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34510 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72   true if another
34520 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d   user of the sam
34530 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 61  e shared btree a
34540 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  s the argument.*
34550 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  * handle holds a
34560 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
34570 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   on the sqlite_m
34580 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a  aster table..*/.
34590 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
345a0 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72  SchemaLocked(Btr
345b0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
345c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
345d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
345e0 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
345f0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
34600 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
34610 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c  c = (queryTableL
34620 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
34630 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d  OT, READ_LOCK)!=
34640 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
34650 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
34660 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
34670 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
34680 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
34690 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  CACHE./*.** Obta
346a0 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  in a lock on the
346b0 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f   table whose roo
346c0 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20  t page is iTab. 
346d0 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20   The.** lock is 
346e0 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  a write lock if 
346f0 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74  isWritelock is t
34700 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f  rue or a read lo
34710 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66  ck.** if it is f
34720 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  alse..*/.int sql
34730 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
34740 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
34750 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74   iTab, u8 isWrit
34760 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
34770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34780 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69  u8 lockType = (i
34790 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45  sWriteLock?WRITE
347a0 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29  _LOCK:READ_LOCK)
347b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
347c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
347d0 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
347e0 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70  p, iTab, lockTyp
347f0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
34800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
34810 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
34820 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
34830 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
34840 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
34850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
34860 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
34870 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
34880 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  B./*.** Argument
34890 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61 20   pCsr must be a 
348a0 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f  cursor opened fo
348b0 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20  r writing on an 
348c0 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  .** INTKEY table
348d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
348e0 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 74  ing at a valid t
348f0 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20  able entry. .** 
34900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
34910 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61 20  difies the data 
34920 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
34930 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a  f that entry..**
34940 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 63   Only the data c
34950 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20  ontent may only 
34960 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 20  be modified, it 
34970 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a  is not possible.
34980 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
34990 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
349a0 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69  ata stored..*/.i
349b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
349c0 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  utData(BtCursor 
349d0 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCsr, u32 offse
349e0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
349f0 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *z){.  assert( 
34a00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
34a10 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCsr) );.  asse
34a20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
34a30 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42 74  x_held(pCsr->pBt
34a40 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  ree->pSqlite->mu
34a50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
34a60 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f  (pCsr->isIncrblo
34a70 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66 28 20  bHandle);.  if( 
34a80 70 43 73 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCsr->eState>=CU
34a90 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
34aa0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73 72   ){.    if( pCsr
34ab0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
34ac0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
34ad0 72 65 74 75 72 6e 20 70 43 73 72 2d 3e 73 6b 69  return pCsr->ski
34ae0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
34af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34b00 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a 20  E_ABORT;.    }. 
34b10 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73   }..  /* Check s
34b20 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e  ome precondition
34b30 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74  s: .  **   (a) t
34b40 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
34b50 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20  n for writing,. 
34b60 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72 65 20   **   (b) there 
34b70 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20  is no read-lock 
34b80 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  on the table bei
34b90 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a  ng modified and.
34ba0 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63    **   (c) the c
34bb0 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20  ursor points at 
34bc0 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61  a valid row of a
34bd0 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a  n intKey table..
34be0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72    */.  if( !pCsr
34bf0 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
34c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
34c10 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73  ADONLY;.  }.  as
34c20 73 65 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74  sert( !pCsr->pBt
34c30 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20  ->readOnly .    
34c40 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70        && pCsr->p
34c50 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
34c60 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
34c70 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  ;.  if( checkRea
34c80 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74  dLocks(pCsr->pBt
34c90 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52  ree, pCsr->pgnoR
34ca0 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20  oot, pCsr) ){.  
34cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34cc0 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
34cd0 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
34ce0 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
34cf0 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ock */.  }.  if(
34d00 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCsr->eState==C
34d10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
34d20 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69   !pCsr->pPage->i
34d30 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
34d40 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
34d50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
34d60 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
34d70 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  sr, offset, amt,
34d80 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
34d90 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f  *)z, 0, 1);.}../
34da0 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  * .** Set a flag
34db0 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
34dc0 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63  to cache the loc
34dd0 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20  ations of pages 
34de0 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65  from the .** ove
34df0 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74  rflow list for t
34e00 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
34e10 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
34e20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
34e30 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61  * for incrementa
34e40 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a  l blob IO only..
34e50 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
34e60 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20  ion sets a flag 
34e70 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c  only. The actual
34e80 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63   page location c
34e90 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20  ache.** (stored 
34ea0 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  in BtCursor.aOve
34eb0 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f  rflow[]) is allo
34ec0 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62  cated and used b
34ed0 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63  y function.** ac
34ee0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74  cessPayload() (t
34ef0 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69  he worker functi
34f00 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74  on for sqlite3Bt
34f10 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a  reeData() and.**
34f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74   sqlite3BtreePut
34f30 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64  Data())..*/.void
34f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 61 63   sqlite3BtreeCac
34f50 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72  heOverflow(BtCur
34f60 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
34f70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
34f80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
34f90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34fa0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
34fb0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
34fc0 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
34fd0 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73  assert(!pCur->is
34fe0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
34ff0 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d  .  assert(!pCur-
35000 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70  >aOverflow);.  p
35010 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
35020 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e  andle = 1;.}.#en
35030 64 69 66 0a                                      dif.