/ Hex Artifact Content
Login

Artifact ff821439edf1fdf85fee7cc7b475b02cacceb2ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 31 38 20 32 30 30 37 2f 30  c,v 1.418 2007/0
0190: 38 2f 32 39 20 31 37 3a 34 33 3a 32 30 20 64 72  8/29 17:43:20 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 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
2870: 45 53 45 45 4b 20 29 3b 0a 23 69 66 6e 64 65 66  ESEEK );.#ifndef
2880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2890: 52 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72  RBLOB.  if( pCur
28a0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
28b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
28c0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
28d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72   }.#endif.  pCur
28e0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
28f0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
2900: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2910: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
2920: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
2930: 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69  y, 0, &pCur->ski
2940: 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
2950: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2960: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
2970: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
2980: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
2990: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29a0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29b0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
29c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29d0: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
29e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
29f0: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
2a00: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2a10: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
2a20: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
2a30: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
2a40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2a50: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2a60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
2a70: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
2a80: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
2a90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2aa0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
2ab0: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
2ac0: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
2ad0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
2ae0: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
2af0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
2b00: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
2b10: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2b20: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
2b30: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
2b40: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2b50: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
2b60: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
2b70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
2b80: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
2b90: 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65  age, iPtrMap, re
2ba0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2bb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2bc0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2bd0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
2be0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
2bf0: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
2c00: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
2c10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
2c20: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
2c30: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
2c40: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
2c50: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
2c60: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2c70: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
2c80: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
2c90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
2ca0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
2cb0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
2cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
2cd0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
2ce0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
2cf0: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
2d00: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
2d10: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
2d20: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
2d30: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
2d40: 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  o'..** An error 
2d50: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2d60: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
2d70: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
2d80: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
2d90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2da0: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
2db0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
2dc0: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
2dd0: 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65  arent){.  DbPage
2de0: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
2df0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
2e00: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
2e10: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
2e20: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
2e30: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
2e40: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
2e50: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
2e60: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
2e70: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
2e80: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
2e90: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
2ea0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2eb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ec0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2ed0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2ee0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
2f00: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
2f10: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
2f20: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
2f30: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
2f40: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
2f50: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
2f60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
2f70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2f80: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
2f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fa0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fb0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
2fc0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
2fd0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
2fe0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2ff0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
3000: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
3010: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3020: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
3030: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66  urn rc;.  }.  of
3040: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
3050: 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79  ROFFSET(pBt, key
3060: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
3070: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
3080: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
3090: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
30a0: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
30b0: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
30c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
30d0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
30e0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
30f0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
3100: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
3110: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
3120: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
3130: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
3140: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
3150: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3160: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
3170: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
3180: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
3190: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
31a0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
31b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
31c0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
31d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31e0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
31f0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
3200: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
3210: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
3220: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
3230: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
3240: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
3250: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
3260: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
3270: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
3280: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
3290: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
32a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
32b0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
32c0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
32d0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
32e0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
32f0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
3300: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
3310: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
3320: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
3330: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
3340: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
3350: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3360: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
3370: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3380: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
3390: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
33a0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
33b0: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
33d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
33e0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
33f0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
3400: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
3410: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3420: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3430: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
3440: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
3450: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
3460: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
3470: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
3480: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
3490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
34a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
34b0: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
34c0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
34d0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
34e0: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
34f0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
3500: 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61  T(pBt, key);.  a
3510: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
3520: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
3530: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
3540: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
3550: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
3560: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3570: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
3580: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
3590: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
35a0: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
35b0: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
35c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
35d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35e0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
35f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3600: 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
3610: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
3620: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
3630: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
3640: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
3650: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
3660: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
3670: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
3680: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
3690: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
36a0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
36b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36c0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
36d0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
36e0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
36f0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
3700: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50  fine findCell(pP
3710: 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20  age, iCell) \.  
3720: 28 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20  ((pPage)->aData 
3730: 2b 20 67 65 74 32 62 79 74 65 28 26 28 70 50 61  + get2byte(&(pPa
3740: 67 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67  ge)->aData[(pPag
3750: 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  e)->cellOffset+2
3760: 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64  *(iCell)])).#ifd
3770: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75  ef SQLITE_TEST.u
3780: 38 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46  8 *sqlite3BtreeF
3790: 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  indCell(MemPage 
37a0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
37b0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
37c0: 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell>=0 );.  asse
37d0: 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79  rt( iCell<get2by
37e0: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37f0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
3800: 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72  t+3]) );.  retur
3810: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
3820: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , iCell);.}.#end
3830: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  if../*.** This a
3840: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
3850: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
3860: 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20  BtreeFindCell() 
3870: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
3880: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
3890: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
38a0: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
38b0: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
38c0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
38d0: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
38e0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
38f0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
3900: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3910: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
3920: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3930: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
3940: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
3950: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
3960: 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65    struct _OvflCe
3970: 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70  ll *pOvfl;.    p
3980: 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61  Ovfl = &pPage->a
3990: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d  Ovfl[i];.    k =
39a0: 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20   pOvfl->idx;.   
39b0: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
39c0: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
39d0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
39e0: 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65  eturn pOvfl->pCe
39f0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
3a00: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
3a10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
3a20: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3a30: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
3a40: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
3a50: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
3a60: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
3a70: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
3a80: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
3a90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
3aa0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69   function.  sqli
3ab0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3ac0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
3ad0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
3ae0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
3af0: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  t and sqlite3Btr
3b00: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
3b10: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
3b20: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
3b30: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
3b40: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
3b50: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
3b60: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
3b70: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
3b80: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
3b90: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73   instead of.** s
3ba0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3bb0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
3bc0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
3bd0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
3be0: 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
3bf0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3c00: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
3c10: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
3c20: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
3c30: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
3c40: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
3c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
3c60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
3c70: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
3c80: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
3c90: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
3ca0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
3cb0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  /.){.  int n;   
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cd0: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
3ce0: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
3cf0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
3d00: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
3d10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3d20: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
3d30: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
3d40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3d50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
3d60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
3d70: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
3d80: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
3d90: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
3da0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
3db0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
3dc0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
3dd0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
3de0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
3df0: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
3e00: 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ata ){.    n += 
3e10: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
3e20: 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64  ll[n], &nPayload
3e30: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3e40: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
3e50: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61  }.  pInfo->nData
3e60: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69   = nPayload;.  i
3e70: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
3e80: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
3e90: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
3ea0: 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d  , (u64 *)&pInfo-
3eb0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
3ec0: 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20  .    u32 x;.    
3ed0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
3ee0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b  (&pCell[n], &x);
3ef0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
3f00: 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f   = x;.    nPaylo
3f10: 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70  ad += x;.  }.  p
3f20: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
3f30: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
3f40: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
3f50: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
3f60: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
3f70: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
3f80: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
3f90: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
3fa0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
3fb0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
3fc0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
3fd0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
3fe0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
3ff0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
4000: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
4010: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
4020: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
4030: 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  s */.    pInfo->
4040: 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61  nLocal = nPayloa
4050: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
4060: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
4070: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
4080: 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e  d + n;.    if( n
4090: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20  Size<4 ){.      
40a0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
40b0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
40c0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
40d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
40e0: 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20  nSize = nSize;. 
40f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
4100: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
4110: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
4120: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
4130: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
4140: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
4150: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
4160: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
4170: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
4180: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
4190: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
41a0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
41b0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
41c0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
41d0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
41e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
41f0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
4200: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
4210: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
4220: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
4230: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
4240: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
4250: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
4260: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
4270: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
4280: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
4290: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
42a0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
42b0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
42c0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
42d0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
42e0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
42f0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4300: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4310: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
4320: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
4330: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4340: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4350: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
4360: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
4370: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
4380: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
4390: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
43a0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
43b0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
43c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
43d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
43e0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
43f0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
4400: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
4410: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
4420: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
4430: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
4440: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
4450: 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73  nLocal = surplus
4460: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4470: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
4480: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
4490: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
44a0: 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d  verflow = pInfo-
44b0: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20  >nLocal + n;.   
44c0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
44d0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
44e0: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
44f0: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
4500: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
4510: 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74  o) \.  sqlite3Bt
4520: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
4530: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
4540: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
4550: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f  l)), (pInfo)).vo
4560: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  id sqlite3BtreeP
4570: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
4580: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
4590: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
45a0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
45b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45d0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
45e0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
45f0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
4600: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
4610: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
4620: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
4630: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4640: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
4650: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
4660: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
4670: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
4680: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
4690: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
46a0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
46b0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
46c0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
46d0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
46e0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
46f0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
4700: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
4710: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
4720: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
4730: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
4740: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64  ointer..*/.#ifnd
4750: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
4760: 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65   int cellSize(Me
4770: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
4780: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c  t iCell){.  Cell
4790: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c  Info info;.  sql
47a0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
47b0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
47c0: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
47d0: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
47e0: 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e  #endif.static in
47f0: 74 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  t cellSizePtr(Me
4800: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4810: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4820: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c  Info info;.  sql
4830: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4840: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
4850: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
4860: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
4870: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4880: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
4890: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
48a0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
48b0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
48c0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
48d0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
48e0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
48f0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
4900: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
4910: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
4920: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
4930: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
4940: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
4950: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
4960: 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20  l){.  if( pCell 
4970: 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
4980: 69 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65  info;.    sqlite
4990: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
49a0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
49b0: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
49c0: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
49d0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
49e0: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
49f0: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
4a00: 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
4a10: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
4a20: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
4a30: 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
4a40: 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
4a50: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
4a60: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
4a70: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
4a80: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
4a90: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
4aa0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
4ab0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
4ac0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4ad0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
4ae0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77  ** If the cell w
4af0: 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20  ith index iCell 
4b00: 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  on page pPage co
4b10: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4b20: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4b30: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4b40: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4b50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4b60: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4b70: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4b80: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4b90: 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  vfl(MemPage *pPa
4ba0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
4bb0: 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61    u8 *pCell;.  a
4bc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4bd0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
4be0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
4bf0: 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76    pCell = findOv
4c00: 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65  erflowCell(pPage
4c10: 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  , iCell);.  retu
4c20: 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  rn ptrmapPutOvfl
4c30: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
4c40: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
4c50: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
4c60: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
4c70: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
4c80: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
4c90: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
4ca0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
4cb0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
4cc0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
4cd0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
4ce0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
4cf0: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
4d00: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
4d10: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
4d20: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a  ontent area..*/.
4d30: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
4d40: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
4d50: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
4d60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
4d80: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
4d90: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
4db0: 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c  ss of a i-th cel
4dc0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  l */.  int addr;
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
4df0: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
4e00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
4e10: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ay */.  int hdr;
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
4e40: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
4e50: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
4e80: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
4e90: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
4ea0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
4eb0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
4ec0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
4ed0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
4ee0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
4ef0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
4f00: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
4f10: 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
4f30: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
4f40: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
4f50: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f70: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
4f80: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
4f90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4fa0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
4fb0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
4fc0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4fd0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
4fe0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
4ff0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ll content */.. 
5000: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5010: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5020: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5040: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5050: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5060: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
5070: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
5080: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
5090: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
50a0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
50b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
50c0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
50d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
50e0: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f   temp = sqlite3_
50f0: 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70  malloc( pPage->p
5100: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
5110: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20    if( temp==0 ) 
5120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5130: 4d 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  MEM;.  data = pP
5140: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
5150: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
5160: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
5170: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
5180: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
5190: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
51a0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
51b0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
51c0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
51d0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
51e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
51f0: 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
5200: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5210: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
5220: 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
5230: 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
5240: 62 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73  brk);.  brk = us
5250: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28  ableSize;.  for(
5260: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
5270: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
5280: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
5290: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
52a0: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
52b0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
52c0: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
52d0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
52e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  ;.    assert( pc
52f0: 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
5300: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  bleSize );.    s
5310: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
5320: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
5330: 63 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20  c]);.    brk -= 
5340: 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  size;.    memcpy
5350: 28 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65  (&data[brk], &te
5360: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
5370: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
5380: 72 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61  r, brk);.  }.  a
5390: 73 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c  ssert( brk>=cell
53a0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29  Offset+2*nCell )
53b0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
53c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b  ta[hdr+5], brk);
53d0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
53e0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
53f0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
5400: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72  r+7] = 0;.  addr
5410: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a   = cellOffset+2*
5420: 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28  nCell;.  memset(
5430: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20  &data[addr], 0, 
5440: 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c  brk-addr);.  sql
5450: 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70 29 3b  ite3_free(temp);
5460: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
5480: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
5490: 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61  es of space on a
54a0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   page..**.** Ret
54b0: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
54c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
54d0: 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  ] of the first b
54e0: 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  yte of.** the ne
54f0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72  w allocation. Or
5500: 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
5510: 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
5520: 20 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f   free.** space o
5530: 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61  n the page to sa
5540: 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61  tisfy the alloca
5550: 74 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a  tion request..**
5560: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
5570: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
5580: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
5590: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
55a0: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
55b0: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
55c0: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
55d0: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
55e0: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
55f0: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
5600: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
5610: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
5620: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
5630: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
5640: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
5650: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
5660: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5670: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
5680: 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72  nt addr, pc, hdr
5690: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
56a0: 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74  int nFrag;.  int
56b0: 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   top;.  int nCel
56c0: 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  l;.  int cellOff
56d0: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
56e0: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20  char *data;.  . 
56f0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5700: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
5710: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5720: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5730: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5740: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
5750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5760: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5770: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5780: 78 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  x) );.  if( nByt
5790: 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b  e<4 ) nByte = 4;
57a0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46  .  if( pPage->nF
57b0: 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61  ree<nByte || pPa
57c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
57d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50  ) return 0;.  pP
57e0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
57f0: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
5800: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
5810: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
5820: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
5830: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
5840: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
5850: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
5860: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
5870: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5880: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5890: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
58a0: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
58b0: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
58c0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
58d0: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
58e0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
58f0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5900: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5910: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
5920: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
5930: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5940: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
5950: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
5960: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
5970: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5980: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5990: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
59a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
59b0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
59c0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
59d0: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
59e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
59f0: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5a00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5a10: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
5a20: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
5a30: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
5a40: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
5a50: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
5a60: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5a70: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5a80: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5a90: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5aa0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5ab0: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5ac0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5ad0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5ae0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5af0: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5b00: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5b10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5b20: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
5b30: 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  te ){.    if( de
5b40: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
5b50: 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ge) ) return 0;.
5b60: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
5b70: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5b80: 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e  ;.  }.  top -= n
5b90: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
5ba0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5bb0: 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  Cell <= top );. 
5bc0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5bd0: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
5be0: 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f  return top;.}../
5bf0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
5c00: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
5c10: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
5c20: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
5c30: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
5c40: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
5c50: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69  ck is pPage->aDi
5c60: 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  sk[start].** and
5c70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5c80: 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22   block is "size"
5c90: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f   bytes..**.** Mo
5ca0: 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74  st of the effort
5cb0: 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65   here is involve
5cc0: 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61  d in coalesing a
5cd0: 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20  djacent.** free 
5ce0: 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69  blocks into a si
5cf0: 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c  ngle big free bl
5d00: 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ock..*/.static v
5d10: 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65  oid freeSpace(Me
5d20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
5d30: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
5d40: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
5d50: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75  pbegin, hdr;.  u
5d60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
5d70: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
5d80: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
5d90: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5da0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5db0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5dc0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5dd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
5de0: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
5df0: 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
5e00: 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61  leaf?0:4) );.  a
5e10: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
5e20: 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42  size)<=pPage->pB
5e30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
5e40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5e50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5e60: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5e70: 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34   );.  if( size<4
5e80: 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69   ) size = 4;..#i
5e90: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
5ea0: 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f  RE_DELETE.  /* O
5eb0: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
5ec0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
5ed0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
5ee0: 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a   SECURE_DELETE .
5ef0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
5f00: 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
5f10: 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73  e-time */.  mems
5f20: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
5f30: 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69   0, size);.#endi
5f40: 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
5f50: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
5f60: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
5f70: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f  of freeblocks */
5f80: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5f90: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
5fa0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
5fb0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
5fc0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
5fd0: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
5fe0: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
5ff0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
6000: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6010: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
6020: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
6030: 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20  ddr );.    addr 
6040: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
6050: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
6060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6070: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73  leSize-4 );.  as
6080: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
6090: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
60a0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
60b0: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
60c0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
60d0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
60e0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
60f0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
6100: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
6110: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20  Free += size;.. 
6120: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
6130: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
6140: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
6150: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
6160: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
6170: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
6180: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
6190: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
61a0: 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73  , psize;.    ass
61b0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
61c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
61d0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
61e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
61f0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
6200: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6210: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
6220: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
6230: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
6240: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
6250: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
6260: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
6270: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
6280: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
6290: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
62a0: 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64   assert( frag<=d
62b0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
62c0: 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20  fset+7] );.     
62d0: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
62e0: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61  Offset+7] -= fra
62f0: 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  g;.      put2byt
6300: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
6310: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6320: 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20  pnext]));.      
6330: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6340: 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b  begin+2], pnext+
6350: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6360: 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29  next+2])-pbegin)
6370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6380: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
6390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
63a0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
63b0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
63c0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
63d0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
63e0: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
63f0: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
6400: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
6410: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
6420: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
6430: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
6440: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
6450: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
6460: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
6470: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
6480: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
6490: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
64a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
64b0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b  ta[hdr+5], top +
64c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
64d0: 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d  pbegin+2]));.  }
64e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
64f0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
6500: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
6510: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
6520: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
6530: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
6540: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
6550: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
6560: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rdingly..*/.stat
6570: 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c  ic void decodeFl
6580: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
6590: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
65a0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
65b0: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
65c0: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
65d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
65e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
65f0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
6600: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
6610: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6620: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6630: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6640: 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  .  pPage->intKey
6650: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28   = (flagByte & (
6660: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
6670: 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20  EAFDATA))!=0;.  
6680: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6690: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
66a0: 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a  F_ZERODATA)!=0;.
66b0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
66c0: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
66d0: 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67  LEAF)!=0;.  pPag
66e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
66f0: 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66  = 4*(pPage->leaf
6700: 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  ==0);.  pBt = pP
6710: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
6720: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
6730: 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70  EAFDATA ){.    p
6740: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
6750: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   1;.    pPage->m
6760: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
6770: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
6780: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
6790: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  lse{.    pPage->
67b0: 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20  leafData = 0;.  
67c0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
67d0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
67e0: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
67f0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
6800: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  nLocal;.  }.  pP
6810: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21  age->hasData = !
6820: 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61  (pPage->zeroData
6830: 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61   || (!pPage->lea
6840: 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  f && pPage->leaf
6850: 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Data));.}../*.**
6860: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
6870: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
6880: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
6890: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   block..**.** Th
68a0: 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
68b0: 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ter must be a po
68c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
68d0: 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  Page which.** is
68e0: 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
68f0: 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e  he page being in
6900: 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
6910: 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72  root of a.** BTr
6920: 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74  ee has no parent
6930: 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74   and so for that
6940: 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d   page, pParent==
6950: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  NULL..**.** Retu
6960: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
6970: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
6980: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
6990: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
69a0: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
69b0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
69c0: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
69d0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
69e0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
69f0: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
6a00: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
6a10: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
6a20: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
6a30: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
6a40: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
6a50: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
6a60: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
6a70: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
6a80: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a  3BtreeInitPage(.
6a90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
6aa0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6ab0: 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69  page to be initi
6ac0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  alized */.  MemP
6ad0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
6ae0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
6af0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6b00: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b   */.){.  int pc;
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6b20: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
6b30: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
6b40: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
6b50: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
6b60: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
6b70: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
6b80: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
6b90: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
6ba0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
6bb0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
6bc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
6bd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
6be0: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
6bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
6c00: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
6c10: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
6c20: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
6c30: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
6c40: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
6c50: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
6c60: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
6c70: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
6c80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
6c90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6ca0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
6cb0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
6cc0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
6cd0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
6ce0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
6cf0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70  ent area */..  p
6d00: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
6d10: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d  .  assert( pBt!=
6d20: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6d30: 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61  Parent==0 || pPa
6d40: 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  rent->pBt==pBt )
6d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6d60: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6d70: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6d80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
6d90: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
6da0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
6db0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
6dc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6dd0: 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69  aData == &((unsi
6de0: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
6df0: 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
6e00: 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ] );.  if( pPage
6e10: 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65  ->pParent!=pPare
6e20: 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50  nt && (pPage->pP
6e30: 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67  arent!=0 || pPag
6e40: 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20  e->isInit) ){.  
6e50: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
6e60: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
6e70: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
6e80: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
6e90: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
6ea0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6eb0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
6ec0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
6ed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6ee0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
6ef0: 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50  pParent==0 && pP
6f00: 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20  arent!=0 ){.    
6f10: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
6f20: 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71   pParent;.    sq
6f30: 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
6f40: 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
6f50: 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61  .  }.  hdr = pPa
6f60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
6f70: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
6f80: 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c  Data;.  decodeFl
6f90: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
6fa0: 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e  hdr]);.  pPage->
6fb0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
6fc0: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
6fd0: 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69   = 0;.  usableSi
6fe0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
6ff0: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63  Size;.  pPage->c
7000: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
7010: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
7020: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
7030: 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  f;.  top = get2b
7040: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7050: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
7060: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
7070: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
7080: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
7090: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
70a0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
70b0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
70c0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
70d0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
70e0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
70f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7100: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
7110: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  age->nCell==0 &&
7120: 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70   pParent!=0 && p
7130: 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
7140: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61  ){.    /* All pa
7150: 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74  ges must have at
7160: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c   least one cell,
7170: 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74   except for root
7180: 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65   pages */.    re
7190: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
71a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
71b0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
71c0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
71d0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
71e0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
71f0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
7200: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
7210: 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65  r+7] + top - (ce
7220: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
7230: 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68  ge->nCell);.  wh
7240: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
7250: 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b   int next, size;
7260: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
7270: 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20  leSize-4 ){.    
7280: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
7290: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
72a0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
72b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
72c0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
72d0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
72e0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
72f0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
7300: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
7310: 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20    if( next>0 && 
7320: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
7330: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
7340: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
7350: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
7360: 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
7370: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7380: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
7390: 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65     nFree += size
73a0: 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b  ;.    pc = next;
73b0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
73c0: 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69  ree = nFree;.  i
73d0: 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65  f( nFree>=usable
73e0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46  Size ){.    /* F
73f0: 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74  ree space cannot
7400: 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61   exceed total pa
7410: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72  ge size */.    r
7420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7430: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a  RUPT_BKPT; .  }.
7440: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
7450: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
7460: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7470: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
7480: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
7490: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
74a0: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
74b0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
74c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
74d0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
74e0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
74f0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
7500: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7510: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
7520: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
7530: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
7540: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7550: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69  Offset;.  int fi
7560: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
7570: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
7580: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
7590: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
75a0: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
75b0: 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65   &data[pBt->page
75c0: 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e  Size] == (unsign
75d0: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29  ed char*)pPage )
75e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
75f0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7600: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7610: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7630: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7640: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
7650: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
7660: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
7670: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  );.  data[hdr] =
7680: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
7690: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
76a0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
76b0: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
76c0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
76d0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
76e0: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
76f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
7700: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
7710: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
7720: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7730: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
7740: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7750: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
7760: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
7770: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
7780: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
7790: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
77a0: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
77b0: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
77c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
77d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
77e0: 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
77f0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
7800: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
7810: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
7820: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
7830: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
7840: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
7850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
7860: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
7870: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
7880: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
7890: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
78a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
78b0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
78c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
78d0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
78e0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
78f0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
7900: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
7910: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
7920: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
7930: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
7940: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
7950: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
7960: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
7970: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
7980: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
7990: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
79a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
79b0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
79c0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
79d0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
79e0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
79f0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
7a00: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
7a10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
7a20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7a30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
7a40: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
7a50: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7a60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
7a70: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
7a80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
7a90: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
7aa0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
7ab0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
7ac0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
7ad0: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
7ae0: 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  ge;.  DbPage *pD
7af0: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
7b00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b10: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b20: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
7b30: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
7b40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
7b50: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
7b60: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
7b70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7b80: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20  urn rc;.  pPage 
7b90: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
7ba0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7bb0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
7bc0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
7bd0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7be0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
7bf0: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
7c00: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
7c10: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
7c20: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
7c30: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
7c40: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
7c50: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
7c60: 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
7c70: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
7c80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7c90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
7ca0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
7cb0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
7cc0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
7cd0: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
7ce0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
7cf0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
7d00: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
7d10: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
7d20: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
7d30: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
7d40: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
7d50: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
7d60: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
7d70: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
7d80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
7d90: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
7da0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
7db0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
7dc0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
7dd0: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
7de0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
7df0: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
7e00: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
7e10: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
7e20: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
7e30: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
7e40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7e50: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7e60: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
7e70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7e80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7e90: 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20  PT; .  }.  rc = 
7ea0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
7eb0: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
7ec0: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
7ed0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7ee0: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
7ef0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
7f00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
7f10: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c  nitPage(*ppPage,
7f20: 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20   pParent);.  }. 
7f30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7f40: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
7f50: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
7f60: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
7f70: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
7f80: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  or.** call to sq
7f90: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
7fa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7fb0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
7fc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
7fd0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
7fe0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7ff0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
8000: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8010: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8020: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
8030: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
8040: 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63  ze]==(unsigned c
8050: 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  har*)pPage );.  
8060: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8070: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8080: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
80a0: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
80b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
80c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
80d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
80e0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
80f0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
8100: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
8110: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
8120: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
8130: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
8140: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
8150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8160: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
8170: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8180: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8190: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
81a0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
81b0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
81c0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
81d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
81e0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
81f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
8200: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  sInit==0 || sqli
8210: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8220: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8230: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
8240: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
8250: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
8260: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
8270: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
8280: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 31  pPage->isInit==1
8290: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
82a0: 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50  pParent->pBt==pP
82b0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
82c0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
82d0: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
82e0: 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
82f0: 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
8300: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
8310: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
8320: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
8330: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
8340: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
8350: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
8360: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
8370: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
8380: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
8390: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
83a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
83b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
83c0: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
83d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
83e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
83f0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
8400: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
8410: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
8420: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
8430: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
8440: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
8450: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
8460: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
8470: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8480: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8490: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
84a0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
84b0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
84c0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
84d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
84e0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
84f0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
8500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
8510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8520: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8530: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
8540: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
8550: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
8560: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
8570: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
8580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
8590: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
85a0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
85b0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
85c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
85d0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
85e0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
85f0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
8600: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
8610: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
8620: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
8630: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
8640: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
8650: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
8660: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
8670: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
8680: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
8690: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
86a0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
86b0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
86c0: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
86d0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
86e0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
86f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8700: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
8710: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
8720: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
8730: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8740: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
8750: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
8760: 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20  ite3 *pSqlite,  
8770: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
8780: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
8790: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
87a0: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
87b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
87c0: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
87d0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
87e0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
8800: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ons */.){.  sqli
8810: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
8820: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
8830: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
8840: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
8850: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
8860: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
8870: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
8880: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
8890: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
88a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
88b0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
88c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
88d0: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  int nReserve;.  
88e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
88f0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20  bHeader[100];.. 
8900: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
8910: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
8920: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
8930: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
8940: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
8950: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
8960: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
8970: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
8980: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
8990: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
89a0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
89b0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
89c0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
89d0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
89e0: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
89f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8a00: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8a10: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8a20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8a30: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
8a40: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
8a50: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
8a60: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
8a70: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
8a80: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
8a90: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
8aa0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
8ab0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
8ac0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
8ad0: 73 65 72 74 28 20 70 53 71 6c 69 74 65 21 3d 30  sert( pSqlite!=0
8ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8af0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8b00: 28 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  (pSqlite->mutex)
8b10: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 70 53   );..  pVfs = pS
8b20: 71 6c 69 74 65 2d 3e 70 56 66 73 3b 0a 20 20 70  qlite->pVfs;.  p
8b30: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
8b40: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
8b50: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
8b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8b70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
8b80: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
8b90: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53  NS_NONE;.  p->pS
8ba0: 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74 65 3b  qlite = pSqlite;
8bb0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
8bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
8bd0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
8be0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8bf0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
8c00: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
8c10: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
8c20: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
8c30: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
8c40: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
8c50: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
8c60: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
8c70: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
8c80: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
8c90: 50 52 49 56 41 54 45 29 3d 3d 30 0a 20 20 20 26  PRIVATE)==0.   &
8ca0: 26 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20  & isMemdb==0.   
8cb0: 26 26 20 28 70 53 71 6c 69 74 65 2d 3e 66 6c 61  && (pSqlite->fla
8cc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
8cd0: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
8ce0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
8cf0: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
8d00: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
8d10: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
8d20: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
8d30: 50 61 74 68 6e 61 6d 65 20 3d 20 28 63 68 61 72  Pathname = (char
8d40: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
8d50: 63 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  c(pVfs->mxPathna
8d60: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
8d70: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
8d80: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e  hared;.      p->
8d90: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
8da0: 20 20 20 20 69 66 28 20 70 53 71 6c 69 74 65 20      if( pSqlite 
8db0: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 71 6c 69  ){.        pSqli
8dc0: 74 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  te->flags |= SQL
8dd0: 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b  ITE_SharedCache;
8de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8df0: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
8e00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
8e10: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
8e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8e30: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
8e40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8e50: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
8e60: 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
8e70: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8e80: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
8e90: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  d = sqlite3_mute
8ea0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
8eb0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
8ec0: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
8ed0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
8ee0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
8ef0: 20 20 20 66 6f 72 28 70 42 74 3d 73 71 6c 69 74     for(pBt=sqlit
8f00: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
8f10: 74 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  t; pBt; pBt=pBt-
8f20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
8f30: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
8f40: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
8f50: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
8f60: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
8f70: 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
8f80: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a  e(pBt->pPager)).
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
8fb0: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
8fc0: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
8fd0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
8fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
8ff0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
9000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9010: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9020: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9030: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
9040: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
9050: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
9060: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
9070: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9080: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
9090: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
90a0: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
90b0: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
90c0: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
90d0: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
90e0: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
90f0: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
9100: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
9110: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
9120: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
9130: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
9140: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
9150: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
9160: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
9170: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
9180: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
9190: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
91a0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
91b0: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
91c0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
91d0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
91e0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
91f0: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
9200: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
9210: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
9220: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
9230: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
9240: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
9250: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
9260: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
9270: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
9280: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
9290: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
92a0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
92b0: 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
92c0: 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
92d0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
92e0: 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
92f0: 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
9300: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
9310: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
9320: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9330: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
9340: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9350: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
9360: 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
9370: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
9380: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
9390: 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
93a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
93b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
93c0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
93d0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
93e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
93f0: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
9400: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
9410: 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45  name, EXTRA_SIZE
9420: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
9430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9440: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9450: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
9460: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
9470: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
9480: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
9490: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
94a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
94b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
94c0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
94d0: 20 7d 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20   }.    p->pBt = 
94e0: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
94f0: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
9500: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
9510: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
9520: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
9530: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
9540: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9550: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
9560: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
9570: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
9580: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
9590: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
95a0: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
95b0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
95c0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
95d0: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
95e0: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
95f0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
9600: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
9610: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
9620: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
9630: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
9640: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
9650: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
9660: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
9670: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
9680: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
9690: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
96a0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
96b0: 7a 65 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ze);.      pBt->
96c0: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 36  maxEmbedFrac = 6
96d0: 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20  4;   /* 25% */. 
96e0: 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62       pBt->minEmb
96f0: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
9700: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 20  * 12.5% */.     
9710: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9720: 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32  c = 32;    /* 12
9730: 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  .5% */.#ifndef S
9740: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9750: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
9760: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
9770: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
9780: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
9790: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
97a0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
97b0: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
97c0: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
97d0: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
97e0: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
97f0: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
9800: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
9810: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
9820: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
9830: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
9840: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
9850: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
9860: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
9870: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
9880: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
9890: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
98a0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
98b0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
98c0: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
98d0: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
98e0: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
98f0: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
9900: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
9910: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
9920: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
9930: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
9940: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
9950: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9960: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
9970: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
9980: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
9990: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
99a0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
99b0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
99c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  .      pBt->maxE
99d0: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
99e0: 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 20 20  ader[21];.      
99f0: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
9a00: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
9a10: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  ];.      pBt->mi
9a20: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
9a30: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 20  eader[23];.     
9a40: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
9a50: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
9a60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9a70: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
9a80: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
9a90: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
9aa0: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
9ab0: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
9ac0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
9ad0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
9ae0: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
9af0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
9b00: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
9b10: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
9b20: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
9b30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
9b40: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
9b50: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
9b60: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
9b70: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ageSize */.    s
9b80: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
9b90: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
9ba0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
9bb0: 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65  ze);.   .#if !de
9bc0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9bd0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9be0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
9bf0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
9c00: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
9c10: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
9c20: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
9c30: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
9c40: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
9c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
9c60: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
9c70: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
9c80: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
9c90: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
9ca0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
9cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
9cc0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
9cd0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
9ce0: 52 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d  R);.      pBt->m
9cf0: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
9d00: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
9d10: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
9d20: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
9d30: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
9d40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
9d50: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 53 71  MEM;.        pSq
9d60: 6c 69 74 65 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  lite->mallocFail
9d70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
9d80: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
9d90: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
9da0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9db0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
9dc0: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
9dd0: 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 53  pNext = sqlite3S
9de0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 0a  haredCacheList;.
9df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 68 61        sqlite3Sha
9e00: 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70  redCacheList = p
9e10: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
9e20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
9e30: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
9e40: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
9e50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9e60: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
9e70: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
9e80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
9e90: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
9ea0: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
9eb0: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
9ec0: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
9ed0: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
9ee0: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
9ef0: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
9f00: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
9f10: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
9f20: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
9f30: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
9f40: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
9f50: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
9f60: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
9f70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
9f80: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
9f90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9fa0: 53 71 6c 69 74 65 2d 3e 6e 44 62 3b 20 69 2b 2b  Sqlite->nDb; i++
9fb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
9fc0: 69 62 20 3d 20 70 53 71 6c 69 74 65 2d 3e 61 44  ib = pSqlite->aD
9fd0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
9fe0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
9ff0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
a000: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
a010: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
a020: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
a030: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
a040: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
a050: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
a060: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
a070: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
a080: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
a090: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
a0a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
a0b0: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
a0c0: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
a0d0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
a0e0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
a0f0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
a100: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a110: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
a120: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
a130: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
a140: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
a150: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
a160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
a170: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a180: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a190: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
a1a0: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
a1b0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
a1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a1d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
a1e0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
a1f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
a200: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a210: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
a220: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
a230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
a240: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
a250: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
a260: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
a270: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
a280: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
a290: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
a2a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a2b0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
a2c0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
a2d0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
a2e0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
a2f0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
a300: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a310: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
a320: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
a330: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
a340: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
a350: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
a360: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
a370: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
a380: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
a390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a3a0: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
a3b0: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
a3c0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
a3d0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a3e0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
a3f0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
a400: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
a410: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
a420: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
a430: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
a440: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
a450: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
a460: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
a470: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a480: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a4a0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
a4b0: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
a4c0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
a4d0: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  <=0 ){.    if( s
a4e0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
a4f0: 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20  eList==pBt ){.  
a500: 20 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65      sqlite3Share
a510: 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74  dCacheList = pBt
a520: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
a530: 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
a540: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
a550: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
a560: 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
a570: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
a580: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
a590: 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
a5a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a5b0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
a5c0: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
a5d0: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
a5e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a5f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
a600: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
a610: 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
a620: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a630: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a640: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a650: 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
a660: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
a670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
a680: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
a690: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
a6a0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
a6b0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
a6c0: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
a6d0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
a6e0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
a6f0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
a700: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
a710: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
a720: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
a730: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a740: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
a750: 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
a760: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
a770: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
a780: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
a790: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
a7a0: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
a7b0: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
a7c0: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
a7d0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
a7e0: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
a7f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
a800: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
a810: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
a820: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
a830: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
a840: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
a850: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
a860: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
a870: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
a880: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
a890: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
a8a0: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
a8b0: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
a8c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
a8d0: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
a8e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
a8f0: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
a900: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
a910: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
a920: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
a930: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
a940: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
a950: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
a960: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
a970: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
a980: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
a990: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
a9a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
a9b0: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
a9c0: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
a9d0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
a9e0: 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
a9f0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
aa00: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
aa10: 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
aa20: 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
aa30: 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
aa40: 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
aa50: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
aa60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
aa70: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
aa80: 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
aa90: 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
aaa0: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
aab0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
aac0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
aad0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
aae0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
aaf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
ab00: 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
ab10: 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
ab20: 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
ab30: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
ab40: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
ab50: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
ab60: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
ab70: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
ab80: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
ab90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
aba0: 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
abb0: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
abc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
abd0: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
abe0: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
abf0: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
ac00: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
ac10: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
ac20: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
ac30: 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
ac40: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
ac50: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
ac60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ac70: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73  * Change the bus
ac80: 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y handler callba
ac90: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ck function..*/.
aca0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
acb0: 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42  SetBusyHandler(B
acc0: 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e  tree *p, BusyHan
acd0: 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b  dler *pHandler){
ace0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
acf0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
ad00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ad10: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69  ex_held(p->pSqli
ad20: 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
ad30: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
ad40: 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 70 42 75  r(p);.  pBt->pBu
ad50: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e  syHandler = pHan
ad60: 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  dler;.  sqlite3P
ad70: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
ad80: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
ad90: 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 73 71 6c  pHandler);.  sql
ada0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
adb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
adc0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
add0: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
ade0: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
adf0: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
ae00: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
ae10: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
ae20: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
ae30: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
ae40: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
ae50: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
ae60: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
ae70: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
ae80: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
ae90: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
aea0: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
aeb0: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
aec0: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
aed0: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
aee0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
aef0: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
af00: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
af10: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
af20: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
af30: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
af40: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
af50: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
af60: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
af70: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
af80: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
af90: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
afa0: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
afb0: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
afc0: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
afd0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
afe0: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
aff0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
b000: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
b010: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
b020: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
b030: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
b040: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
b050: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
b060: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
b070: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
b080: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b090: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
b0a0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
b0b0: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
b0c0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b0d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b0e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b0f0: 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
b100: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
b110: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
b120: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
b130: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
b140: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
b150: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
b160: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b170: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b180: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
b190: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
b1a0: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
b1b0: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
b1c0: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
b1d0: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
b1e0: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
b1f0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
b200: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
b210: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
b220: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
b230: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
b240: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
b250: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
b260: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
b270: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
b280: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
b290: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
b2a0: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
b2b0: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
b2c0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
b2d0: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
b2e0: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
b2f0: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
b300: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
b310: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
b320: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
b330: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
b340: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
b350: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
b360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
b370: 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
b380: 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
b390: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
b3a0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b3b0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b3c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b3d0: 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
b3e0: 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  e->mutex) );.  s
b3f0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b400: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
b410: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
b420: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
b430: 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
b440: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b450: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b460: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
b470: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b480: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
b490: 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
b4a0: 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
b4b0: 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
b4c0: 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
b4d0: 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
b4e0: 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
b4f0: 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
b500: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b510: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
b520: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
b530: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b540: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
b550: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b560: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c  tex_held(p->pSql
b570: 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  ite->mutex) );  
b580: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
b590: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
b5a0: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
b5b0: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
b5c0: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
b5d0: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
b5e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b5f0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b600: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
b610: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b620: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
b630: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b640: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
b650: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b660: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
b670: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
b680: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
b690: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
b6a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
b6b0: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
b6c0: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
b6d0: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
b6e0: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
b6f0: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
b700: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
b710: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
b720: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
b730: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
b740: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
b750: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
b760: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
b770: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
b780: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
b790: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b7a0: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
b7b0: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
b7c0: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
b7d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
b7e0: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
b7f0: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
b800: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
b810: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
b820: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
b830: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
b840: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
b850: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
b860: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
b870: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
b880: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
b890: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
b8a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b8b0: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
b8c0: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
b8d0: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
b8e0: 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
b8f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b900: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b910: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
b920: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
b930: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
b940: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
b950: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b960: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
b970: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
b980: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
b990: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
b9a0: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
b9b0: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
b9c0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
b9d0: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
b9e0: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
b9f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
ba00: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
ba10: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
ba20: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
ba30: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
ba40: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
ba50: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
ba60: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
ba70: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
ba80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ba90: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
baa0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
bab0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
bac0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
bad0: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  geSize);.  }.  p
bae0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
baf0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
bb00: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c   nReserve;.  sql
bb10: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bb20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bb30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
bb40: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
bb50: 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
bb60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
bb70: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
bb80: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
bb90: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
bba0: 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ize;.}.int sqlit
bbb0: 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
bbc0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
bbd0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
bbe0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
bbf0: 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
bc00: 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
bc10: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
bc20: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bc30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
bc40: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
bc50: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
bc60: 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
bc70: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
bc80: 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
bc90: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
bca0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
bcb0: 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
bcc0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
bcd0: 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
bce0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
bcf0: 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
bd00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
bd10: 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
bd20: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
bd30: 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
bd40: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bd50: 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
bd60: 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
bd70: 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
bd80: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
bd90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
bda0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
bdb0: 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n n;.}.#endif /*
bdc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bdd0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
bde0: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
bdf0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
be00: 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
be10: 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
be20: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
be30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
be40: 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
be50: 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
be60: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
be70: 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
be80: 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
be90: 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
bea0: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
beb0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
bec0: 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
bed0: 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
bee0: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
bef0: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
bf00: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
bf10: 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
bf20: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
bf30: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
bf40: 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
bf50: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
bf60: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
bf70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bf80: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
bf90: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bfa0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
bfb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bfc0: 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74  .  int av = (aut
bfd0: 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20  oVacuum?1:0);.. 
bfe0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
bff0: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
c000: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
c010: 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f  && av!=pBt->auto
c020: 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
c030: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
c040: 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
c050: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
c060: 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c   = av;.  }.  sql
c070: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
c080: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c090: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
c0a0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
c0b0: 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
c0c0: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
c0d0: 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
c0e0: 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
c0f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
c100: 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
c110: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c120: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
c130: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
c140: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c150: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
c160: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
c170: 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
c180: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
c190: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
c1a0: 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
c1b0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
c1c0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
c1d0: 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
c1e0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
c1f0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
c200: 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
c210: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
c220: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
c230: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c240: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
c250: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
c260: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
c270: 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
c280: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
c290: 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
c2a0: 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
c2b0: 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
c2c0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
c2d0: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
c2e0: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
c2f0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
c300: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
c310: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
c320: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c330: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
c340: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
c350: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
c360: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
c370: 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
c380: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
c390: 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
c3a0: 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
c3b0: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
c3c0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
c3d0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65  {.  int rc, page
c3e0: 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Size;.  MemPage 
c3f0: 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
c400: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c410: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c420: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
c430: 3e 70 50 61 67 65 31 20 29 20 72 65 74 75 72 6e  >pPage1 ) return
c440: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63   SQLITE_OK;.  rc
c450: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
c460: 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
c470: 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
c480: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c490: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
c4a0: 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
c4b0: 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
c4c0: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
c4d0: 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
c4e0: 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
c4f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
c500: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49    */.  rc = SQLI
c510: 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28  TE_NOTADB;.  if(
c520: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
c530: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
c540: 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75 38 20  er)>0 ){.    u8 
c550: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
c560: 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  >aData;.    if( 
c570: 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
c580: 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
c590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c5a0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c5b0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
c5c0: 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
c5d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
c5e0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
c5f0: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
c600: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
c610: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
c620: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
c630: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
c640: 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
c650: 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
c660: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
c670: 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
c680: 31 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  12 ){.      goto
c690: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c6a0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
c6b0: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
c6c0: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  & 7)==0 );.    p
c6d0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
c6e0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
c6f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
c700: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
c710: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 74  20];.    if( pBt
c720: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30  ->usableSize<500
c730: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
c740: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
c750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
c760: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20  >maxEmbedFrac = 
c770: 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70  page1[21];.    p
c780: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
c790: 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20   = page1[22];.  
c7a0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72    pBt->minLeafFr
c7b0: 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a  ac = page1[23];.
c7c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c7d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
c7e0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
c7f0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
c800: 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
c810: 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
c820: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
c830: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
c840: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
c850: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
c860: 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
c870: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
c880: 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
c890: 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
c8a0: 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
c8b0: 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
c8c0: 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
c8d0: 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
c8e0: 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
c8f0: 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
c900: 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
c910: 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
c920: 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
c930: 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
c940: 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
c950: 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
c960: 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
c970: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
c980: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
c990: 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
c9a0: 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
c9b0: 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
c9c0: 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
c9d0: 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
c9e0: 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
c9f0: 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
ca00: 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
ca10: 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
ca20: 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  iner, a header w
ca30: 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
ca40: 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
ca50: 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
ca60: 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
ca70: 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
ca80: 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
ca90: 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
caa0: 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
cab0: 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  axLocal = (pBt->
cac0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
cad0: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
cae0: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
caf0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42  ->minLocal = (pB
cb00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
cb10: 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46  )*pBt->minEmbedF
cb20: 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  rac/255 - 23;.  
cb30: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
cb40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
cb50: 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
cb60: 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
cb70: 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e  leSize-12)*pBt->
cb80: 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20  minLeafFrac/255 
cb90: 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d  - 23;.  if( pBt-
cba0: 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d  >minLocal>pBt->m
cbb0: 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e  axLocal || pBt->
cbc0: 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20  maxLocal<0 ){.  
cbd0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
cbe0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20  t_failed;.  }.  
cbf0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
cc00: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
cc10: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
cc20: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
cc30: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
cc40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
cc50: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
cc60: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
cc70: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
cc80: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
cc90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cca0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
ccb0: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
ccc0: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
ccd0: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
cce0: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
ccf0: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
cd00: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
cd10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
cd20: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
cd30: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
cd40: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
cd50: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
cd60: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
cd70: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
cd80: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
cd90: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
cda0: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
cdb0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
cdc0: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
cdd0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
cde0: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
cdf0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ce00: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
ce10: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
ce20: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
ce30: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
ce40: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
ce50: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
ce60: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
ce70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ce80: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
ce90: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
cea0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
ceb0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
cec0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
ced0: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
cee0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
cef0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
cf00: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
cf10: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
cf20: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
cf30: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
cf40: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
cf50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
cf60: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
cf70: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
cf80: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
cf90: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
cfa0: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
cfb0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
cfc0: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
cfd0: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
cfe0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
cff0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
d000: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
d010: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d020: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
d030: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
d040: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
d050: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d060: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
d070: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
d080: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
d090: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
d0a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d0b0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d0c0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
d0d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
d0e0: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
d0f0: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
d100: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
d110: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d120: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
d130: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
d140: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
d150: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30  pPage1->aData==0
d160: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
d170: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74  age *pPage = pBt
d180: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20  ->pPage1;.      
d190: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
d1a0: 20 26 28 28 75 38 2a 29 70 50 61 67 65 29 5b 2d   &((u8*)pPage)[-
d1b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
d1c0: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
d1d0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
d1e0: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
d1f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d200: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
d210: 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  ->pPage1);.    }
d220: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
d230: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
d240: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nStmt = 0;.  }.}
d250: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
d260: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79   new database by
d270: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
d280: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
d290: 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  the.** file..*/.
d2a0: 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
d2b0: 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
d2c0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
d2d0: 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
d2e0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
d2f0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
d300: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d310: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d320: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
d330: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
d340: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20  (pBt->pPager)>0 
d350: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d360: 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d  OK;.  pP1 = pBt-
d370: 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
d380: 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
d390: 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
d3a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
d3b0: 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
d3c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
d3d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d3e0: 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
d3f0: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
d400: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
d410: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
d420: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
d430: 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
d440: 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
d450: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
d460: 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
d470: 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
d480: 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74    data[20] = pBt
d490: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
d4a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
d4b0: 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e  data[21] = pBt->
d4c0: 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20  maxEmbedFrac;.  
d4d0: 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e  data[22] = pBt->
d4e0: 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20  minEmbedFrac;.  
d4f0: 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e  data[23] = pBt->
d500: 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d  minLeafFrac;.  m
d510: 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
d520: 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
d530: 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
d540: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
d550: 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
d560: 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
d570: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
d580: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d590: 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
d5a0: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
d5b0: 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
d5c0: 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
d5d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
d5e0: 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
d5f0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
d600: 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
d610: 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
d620: 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
d630: 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
d640: 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
d650: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
d660: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
d670: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d680: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
d690: 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
d6a0: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
d6b0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
d6c0: 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
d6d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
d6e0: 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
d6f0: 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
d700: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
d710: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
d720: 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
d730: 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
d740: 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
d750: 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
d760: 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
d770: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
d780: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
d790: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
d7a0: 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
d7b0: 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
d7c0: 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
d7d0: 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
d7e0: 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
d7f0: 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
d800: 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
d810: 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
d820: 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
d830: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
d840: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
d850: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
d860: 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
d870: 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
d880: 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
d890: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
d8a0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
d8b0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
d8c0: 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
d8d0: 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
d8e0: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
d8f0: 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
d900: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
d910: 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
d920: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d930: 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
d940: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
d950: 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
d960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d970: 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
d980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d990: 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
d9a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
d9b0: 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
d9c0: 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
d9d0: 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
d9e0: 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
d9f0: 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
da00: 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
da10: 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
da20: 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
da30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
da40: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
da50: 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
da60: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
da70: 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
da80: 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
da90: 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
daa0: 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
dab0: 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
dac0: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
dad0: 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
dae0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
daf0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
db00: 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
db10: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
db20: 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
db30: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
db40: 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
db50: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
db60: 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
db70: 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
db80: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
db90: 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
dba0: 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
dbb0: 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
dbc0: 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
dbd0: 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
dbe0: 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
dbf0: 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
dc00: 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
dc10: 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
dc20: 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
dc30: 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
dc40: 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
dc50: 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
dc60: 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
dc70: 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
dc80: 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
dc90: 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
dca0: 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
dcb0: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
dcc0: 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
dcd0: 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
dce0: 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
dcf0: 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
dd00: 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
dd10: 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
dd20: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
dd30: 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
dd40: 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68   wrflag){.  BtSh
dd50: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
dd60: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
dd70: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
dd80: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
dd90: 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
dda0: 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
ddb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
ddc0: 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
ddd0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
dde0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
ddf0: 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
de00: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
de10: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
de20: 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
de30: 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
de40: 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
de50: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
de60: 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
de70: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
de80: 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
de90: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
dea0: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
deb0: 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
dec0: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
ded0: 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
dee0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
def0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
df00: 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
df10: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
df20: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
df30: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
df40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
df50: 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
df60: 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
df70: 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
df80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
df90: 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
dfa0: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
dfb0: 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
dfc0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
dfd0: 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
dfe0: 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
dff0: 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  TE_BUSY..  */.  
e000: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
e010: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
e020: 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b  ITE && wrflag ){
e030: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e040: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
e050: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e060: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
e070: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
e080: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
e090: 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
e0a0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
e0b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
e0c0: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
e0d0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e0e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e0f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e110: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e120: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
e130: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
e140: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
e150: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e160: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e170: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
e180: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
e190: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e1a0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
e1b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e1c0: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
e1d0: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
e1e0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e1f0: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
e200: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
e210: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
e220: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
e230: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
e240: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
e250: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
e260: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
e270: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73  andler(pBt->pBus
e280: 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20  yHandler) );..  
e290: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e2a0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
e2b0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
e2c0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
e2d0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
e2e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
e2f0: 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
e300: 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
e310: 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
e320: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
e330: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
e340: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
e350: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
e360: 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
e370: 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
e380: 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  n:.  btreeIntegr
e390: 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
e3a0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
e3b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e3c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e3d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
e3e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
e3f0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
e400: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
e410: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
e420: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
e430: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
e440: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
e450: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
e460: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
e470: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
e480: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
e490: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
e4a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
e4b0: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
e4c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
e4d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
e500: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
e510: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
e540: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
e550: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e580: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
e590: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
e5a0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
e5b0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
e5c0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
e5d0: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
e5e0: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
e5f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e600: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
e610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
e620: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
e630: 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
e640: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
e650: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e660: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
e670: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
e680: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
e690: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
e6a0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
e6b0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
e6c0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
e6d0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
e6e0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
e6f0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
e700: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
e710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e720: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
e730: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
e740: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
e750: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
e760: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
e770: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
e780: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
e790: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
e7a0: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
e7b0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
e7c0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
e7d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e7e0: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
e7f0: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
e800: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
e810: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
e820: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
e830: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
e840: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
e850: 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
e860: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
e870: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
e880: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
e890: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
e8a0: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
e8b0: 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
e8c0: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
e8d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e8e0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
e8f0: 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
e900: 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
e910: 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
e920: 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
e930: 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
e940: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
e950: 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
e960: 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
e970: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
e980: 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
e990: 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
e9a0: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
e9b0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
e9c0: 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
e9d0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
e9e0: 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
e9f0: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
ea00: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
ea10: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
ea20: 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
ea30: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
ea40: 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
ea50: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
ea60: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
ea70: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
ea80: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
ea90: 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
eab0: 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
eac0: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
ead0: 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
eae0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
eaf0: 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
eb00: 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
eb10: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
eb20: 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
eb30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
eb40: 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
eb50: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
eb60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
eb70: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
eb80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
eb90: 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
eba0: 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
ebb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ebc0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ebd0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ebe0: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
ebf0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
ec00: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
ec10: 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
ec20: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
ec30: 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
ec40: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
ec50: 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
ec60: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
ec70: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
ec80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ec90: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
eca0: 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
ecb0: 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
ecc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ecd0: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
ece0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
ecf0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
ed00: 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
ed10: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
ed20: 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
ed30: 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
ed40: 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
ed50: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
ed60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
ed70: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
ed80: 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
ed90: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
eda0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
edb0: 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
edc0: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
edd0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
ede0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
edf0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
ee00: 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
ee10: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
ee20: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
ee30: 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
ee40: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
ee50: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
ee60: 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
ee70: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
ee80: 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
ee90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eeb0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
eec0: 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
eed0: 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
eee0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
eef0: 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
ef00: 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
ef10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
ef20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ef30: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
ef40: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
ef50: 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
ef60: 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
ef70: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
ef80: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
ef90: 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
efa0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
efb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
efc0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
efd0: 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
efe0: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
eff0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f000: 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
f010: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
f020: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
f030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f040: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
f050: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
f060: 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
f070: 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
f080: 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
f090: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
f0a0: 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
f0b0: 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
f0c0: 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   valid..*/.stati
f0d0: 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
f0e0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
f0f0: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
f100: 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
f110: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
f120: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
f130: 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
f140: 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
f150: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
f160: 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
f170: 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
f180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
f190: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
f1a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
f1b0: 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
f1c0: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
f1d0: 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20  gno iFreePage   
f1e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
f1f0: 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
f200: 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b  pDbPage to */.){
f210: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
f220: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
f230: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
f240: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
f250: 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
f260: 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
f270: 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
f280: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
f290: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
f2a0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
f2b0: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
f2c0: 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
f2d0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
f2e0: 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
f2f0: 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
f300: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
f310: 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
f320: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f330: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f340: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f350: 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
f360: 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
f370: 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
f380: 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74  rom it's current
f390: 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
f3a0: 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
f3b0: 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
f3c0: 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
f3d0: 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
f3e0: 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
f3f0: 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
f400: 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
f410: 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
f420: 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
f430: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f440: 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
f450: 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
f460: 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  ge, iFreePage);.
f470: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f480: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
f490: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
f4a0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
f4b0: 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
f4c0: 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
f4d0: 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
f4e0: 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
f4f0: 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
f500: 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
f510: 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
f520: 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
f530: 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
f540: 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
f550: 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
f560: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
f570: 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
f580: 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
f590: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
f5a0: 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
f5b0: 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
f5c0: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
f5d0: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
f5e0: 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
f5f0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
f600: 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
f610: 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
f620: 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
f630: 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
f640: 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
f650: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
f660: 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
f670: 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
f680: 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
f690: 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
f6a0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
f6b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f6c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
f6d0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
f6e0: 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
f6f0: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
f700: 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
f710: 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
f720: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
f730: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
f740: 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
f750: 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
f760: 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  eePage);.      i
f770: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f780: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
f790: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
f7a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
f7b0: 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
f7c0: 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
f7d0: 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
f7e0: 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
f7f0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
f800: 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
f810: 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
f820: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
f830: 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
f840: 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
f850: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
f860: 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
f870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f880: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
f890: 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
f8a0: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
f8b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f8c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
f8e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
f8f0: 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
f900: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
f910: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f920: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
f930: 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
f940: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f950: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
f960: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
f970: 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
f980: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
f990: 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
f9a0: 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
f9b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f9c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f9d0: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
f9e0: 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
f9f0: 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
fa00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
fa10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
fa20: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
fa30: 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
fa40: 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
fa50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
fa60: 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
fa70: 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
fa80: 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
fa90: 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
faa0: 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
fab0: 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
fac0: 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
fad0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
fae0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
faf0: 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
fb00: 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
fb10: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
fb20: 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
fb30: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
fb40: 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
fb50: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
fb60: 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
fb70: 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
fb80: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
fb90: 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
fba0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
fbb0: 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
fbc0: 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
fbd0: 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
fbe0: 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
fbf0: 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
fc00: 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
fc10: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
fc20: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
fc30: 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
fc40: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
fc50: 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
fc60: 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
fc70: 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
fc80: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
fc90: 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
fca0: 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
fcb0: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
fcc0: 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
fcd0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
fce0: 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
fcf0: 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
fd00: 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
fd10: 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
fd20: 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
fd30: 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29  *pBt, Pgno nFin)
fd40: 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  {.  Pgno iLastPg
fd50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
fd60: 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   Last page in th
fd70: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
fd80: 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
fd90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fda0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
fdb0: 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
fdc0: 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
fdd0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fde0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
fdf0: 20 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d 20   );.  iLastPg = 
fe00: 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69  pBt->nTrunc;.  i
fe10: 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b  f( iLastPg==0 ){
fe20: 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 73  .    iLastPg = s
fe30: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
fe40: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
fe50: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50  );.  }..  if( !P
fe60: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
fe70: 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
fe80: 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
fe90: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
fea0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
feb0: 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
fec0: 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
fed0: 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
fee0: 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
fef0: 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
ff00: 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
ff10: 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d  ist==0 || nFin==
ff20: 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20  iLastPg ){.     
ff30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
ff40: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
ff50: 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
ff60: 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
ff70: 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
ff80: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ff90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ffa0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
ffb0: 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
ffc0: 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
ffd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ffe0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fff0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
10000 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
10010 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
10020 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20      if( nFin==0 
10030 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
10040 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
10050 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
10060 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
10070 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
10080 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20       ** if nFin 
10090 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
100a0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
100b0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
100c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
100d0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
100e0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
100f0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
10100 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
10110 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
10120 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
10130 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
10140 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
10150 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
10160 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10170 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
10180 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
10190 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
101a0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
101b0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
101c0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 1);.        i
101d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
101e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
101f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10200 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
10210 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
10220 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
10230 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
10240 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
10250 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
10260 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
10270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10280 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
10290 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
102a0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
102b0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20  age *pLastPg;.. 
102c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
102d0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
102e0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
102f0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
10300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10310 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
10320 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10330 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
10340 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
10350 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
10360 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
10370 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
10380 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
10390 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
103a0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
103b0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
103c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
103d0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
103e0 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
103f0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
10400 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
10410 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
10420 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
10430 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
10440 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
10450 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
10460 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
10470 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10480 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
10490 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
104a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
104b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
104c0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
104d0 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
104e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
104f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10500 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
10510 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
10520 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10540 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10550 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
10560 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
10570 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
10580 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10590 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
105a0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
105b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
105c0 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e  rWrite(pLastPg->
105d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
105e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
105f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
10600 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20  urn rc;.      } 
10610 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
10620 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
10630 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
10640 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 29  trPage, iFreePg)
10650 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
10660 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
10670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
106a0 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    } .    }.  }..
106b0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
106c0 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77  iLastPg - 1;.  w
106d0 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e  hile( pBt->nTrun
106e0 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  c==PENDING_BYTE_
106f0 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
10700 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
10710 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20  t->nTrunc) ){.  
10720 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b    pBt->nTrunc--;
10730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10740 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10750 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
10760 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
10770 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
10780 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
10790 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
107a0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
107b0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
107c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
107d0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
107e0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
107f0 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
10800 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
10810 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
10820 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
10830 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
10840 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
10850 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
10860 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  occured,.** SQLI
10870 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10880 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
10890 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
108a0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
108b0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
108c0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
108d0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
108e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
108f0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
10900 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
10910 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
10920 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
10930 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
10940 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
10950 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
10960 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
10970 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
10980 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10990 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
109a0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
109b0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
109c0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b  uumStep(pBt, 0);
109d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
109e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
109f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10a00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10a10 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
10a20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
10a30 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
10a40 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
10a50 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
10a60 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
10a70 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
10a80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
10a90 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
10aa0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
10ab0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10ac0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
10ad0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
10ae0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
10af0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
10b00 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
10b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
10b20 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
10b30 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
10b40 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
10b50 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
10b60 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
10b70 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
10b80 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
10b90 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72  *pBt, Pgno *pnTr
10ba0 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
10bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
10bc0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
10bd0 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64  t->pPager;.#ifnd
10be0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
10bf0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
10c00 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
10c10 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  er);.#endif..  a
10c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10c30 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10c40 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
10c50 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
10c60 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
10c70 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
10c80 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
10c90 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
10ca0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
10cb0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74   0;..    if( pBt
10cc0 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20  ->nTrunc==0 ){. 
10cd0 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b       Pgno nFree;
10ce0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  .      Pgno nPtr
10cf0 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  map;.      const
10d00 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
10d10 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
10d20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73 71   Pgno nOrig = sq
10d30 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
10d40 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10d50 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52  ;..      if( PTR
10d60 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
10d70 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20  nOrig) ){.      
10d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10d90 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
10da0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10db0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
10dc0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
10dd0 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d  .        nOrig--
10de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10df0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
10e00 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
10e10 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20  Data[36]);.     
10e20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
10e30 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
10e40 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
10e50 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
10e60 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d  5);.      nFin =
10e70 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
10e80 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
10e90 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
10ea0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
10eb0 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e   && nFin<=PENDIN
10ec0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
10ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
10ee0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10ef0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
10f00 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
10f10 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
10f20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
10f30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69  ) ){.        nFi
10f40 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
10f50 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72   }..    while( r
10f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10f70 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
10f80 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
10f90 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Fin);.    }.    
10fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
10fb0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ONE ){.      ass
10fc0 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70  ert(nFin==0 || p
10fd0 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c  Bt->nTrunc==0 ||
10fe0 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75   nFin<=pBt->nTru
10ff0 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nc);.      rc = 
11000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
11010 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
11020 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11030 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11040 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
11050 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
11060 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
11070 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
11080 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  2], 0);.        
11090 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
110a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
110b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  , 0);.        pB
110c0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e  t->nTrunc = nFin
110d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
110e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
110f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11100 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
11110 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11120 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
11130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11140 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42     *pnTrunc = pB
11150 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70  t->nTrunc;.    p
11160 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  Bt->nTrunc = 0;.
11170 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11180 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
11190 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
111a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
111b0 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
111c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
111d0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
111e0 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
111f0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
11200 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
11210 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
11220 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
11230 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
11240 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
11250 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
11260 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
11270 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
11280 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
11290 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
112a0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
112b0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
112c0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
112d0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
112e0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
112f0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
11300 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
11310 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
11320 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
11330 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
11340 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
11350 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
11360 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
11370 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
11380 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
11390 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
113a0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
113b0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
113c0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
113d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
113e0 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
113f0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
11400 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
11410 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
11420 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
11430 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
11440 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
11450 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11460 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
11470 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
11480 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
11490 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
114a0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
114b0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
114c0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
114d0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
114e0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
114f0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
11500 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
11510 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
11520 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
11530 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
11540 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11550 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
11560 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
11570 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
11580 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
11590 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
115a0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
115b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
115c0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
115d0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
115e0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
115f0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
11600 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11610 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
11620 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
11630 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
11640 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
11650 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
11660 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
11670 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
11680 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
11690 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
116a0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
116b0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
116c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
116d0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
116e0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
116f0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
11700 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
11710 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
11720 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
11730 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
11740 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
11750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
11760 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
11770 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
11780 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11790 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f  p->pBt;.    Pgno
117a0 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20   nTrunc = 0;.   
117b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
117c0 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
117d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
117e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
117f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
11800 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
11810 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
11820 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20  , &nTrunc); .   
11830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11850 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11860 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
11870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
11880 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
118a0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
118b0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
118c0 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
118d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
118e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
118f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11900 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
11910 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
11920 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
11930 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
11940 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
11950 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
11960 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
11970 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
11980 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
11990 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
119a0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
119b0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
119c0 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
119d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
119e0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
119f0 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
11a00 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
11a10 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
11a20 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
11a30 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
11a40 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
11a50 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
11a60 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
11a70 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
11a80 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
11a90 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
11aa0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
11ab0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
11ac0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
11ad0 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
11ae0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
11af0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
11b00 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
11b10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
11b20 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
11b30 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
11b40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
11b50 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
11b60 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
11b70 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
11b80 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
11b90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11ba0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11bb0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
11bc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11bd0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
11be0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11bf0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
11c00 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
11c10 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
11c20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11c30 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
11c40 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
11c50 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
11c60 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
11c70 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
11c80 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
11c90 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
11ca0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
11cb0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
11cc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
11cd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
11ce0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
11cf0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
11d00 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
11d10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11d20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
11d30 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
11d40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11d70 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
11d80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
11d90 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
11da0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
11db0 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  D;.    pBt->inSt
11dc0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e  mt = 0;.  }.  un
11dd0 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
11de0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
11df0 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69  andle has any ki
11e00 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
11e10 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
11e20 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
11e30 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  n.  ** count of 
11e40 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
11e50 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
11e60 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68  tion count reach
11e70 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74  es 0, set.  ** t
11e80 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
11e90 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
11ea0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
11eb0 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65  Unused() call be
11ec0 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e  low.  ** will un
11ed0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
11ee0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
11ef0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
11f00 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  E ){.    pBt->nT
11f10 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
11f20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
11f30 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
11f40 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
11f50 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
11f60 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
11f70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e    /* Set the han
11f80 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61  dles current tra
11f90 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
11fa0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
11fb0 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
11fc0 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
11fd0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
11fe0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
11ff0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
12000 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   */.  p->inTrans
12010 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
12020 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
12030 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
12040 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12050 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12060 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12080 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
12090 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
120a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
120b0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
120c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
120d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
120e0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
120f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12100 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
12110 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
12130 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12140 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
12150 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
12160 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
12180 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
12190 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
121a0 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
121b0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
121c0 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
121d0 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
121e0 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
121f0 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
12200 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
12210 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
12220 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
12230 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
12240 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
12250 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
12260 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
12270 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
12280 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
12290 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
122a0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
122b0 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
122c0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
122d0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
122e0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
122f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12300 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
12310 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
12320 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
12330 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
12340 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
12350 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
12360 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
12370 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
12380 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
12390 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
123a0 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
123b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
123c0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
123d0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
123e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
123f0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
12400 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
12410 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
12420 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
12430 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12440 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
12450 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
12460 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12470 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
12480 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
12490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
124a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
124b0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
124c0 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  t, 0, 0);.#ifnde
124d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
124e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
124f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12500 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
12510 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75   a horrible situ
12520 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20  ation. An IO or 
12530 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
12540 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20  ccured whilst.  
12550 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
12560 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
12570 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
12580 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
12590 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
125a0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
125b0 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
125c0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
125d0 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
125e0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
125f0 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
12600 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
12610 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
12620 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
12630 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
12640 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
12650 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
12660 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
12670 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
12680 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
12690 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
126a0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
126b0 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
126c0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ve..    */.    w
126d0 68 69 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73  hile( pBt->pCurs
126e0 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  or ){.      sqli
126f0 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70  te3 *db = pBt->p
12700 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e  Cursor->pBtree->
12710 70 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69  pSqlite;.      i
12720 66 28 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20  f( db ){.       
12730 20 2f 2a 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 54   /**** FIX ME: T
12740 68 69 73 20 63 61 6e 20 64 65 61 64 6c 6f 63 6b  his can deadlock
12750 20 2a 2a 2a 2a 2f 0a 20 20 20 20 20 20 20 20 73   ****/.        s
12760 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12770 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
12780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
12790 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64  ortOtherActiveVd
127a0 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  bes(db, 0);.    
127b0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
127c0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
127d0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
127e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  }.  }.#endif.  b
127f0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
12800 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  ;.  unlockAllTab
12810 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  les(p);..  if( p
12820 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
12830 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
12840 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20  t rc2;..#ifndef 
12850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12860 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
12870 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64  nTrunc = 0;.#end
12880 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
12890 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
128a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
128b0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
128c0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
128d0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
128e0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
128f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12900 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
12910 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
12920 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
12930 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
12940 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
12950 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
12960 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12970 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
12980 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
12990 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
129a0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
129b0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
129c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
129d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
129e0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
129f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12a00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
12a10 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
12a20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
12a30 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
12a40 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
12a50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
12a60 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
12a70 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12a80 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
12a90 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12aa0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
12ab0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
12ac0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
12ad0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
12ae0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
12af0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
12b00 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
12b10 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12b20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
12b30 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e  NS_NONE;.  pBt->
12b40 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e  inStmt = 0;.  un
12b50 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
12b60 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
12b70 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
12b80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12b90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12ba0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
12bb0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
12bc0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54  btransaction.  T
12bd0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
12be0 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  n can.** can be 
12bf0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65  rolled back inde
12c00 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
12c10 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
12c20 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73  n..** You must s
12c30 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
12c40 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  on before starti
12c50 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
12c60 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74  ion..** The subt
12c70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
12c80 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
12c90 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y if the main tr
12ca0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d  ansaction.** com
12cb0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
12cc0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f  ck..**.** Only o
12cd0 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ne subtransactio
12ce0 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20  n may be active 
12cf0 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69  at a time.  It i
12d00 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72  s an error to tr
12d10 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20  y.** to start a 
12d20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69  new subtransacti
12d30 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75  on if another su
12d40 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
12d50 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
12d60 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
12d70 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
12d80 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
12d90 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
12da0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
12db0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
12dc0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
12dd0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
12de0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
12df0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
12e00 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
12e10 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
12e20 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
12e30 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
12e40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
12e50 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
12e60 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
12e70 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
12e80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12e90 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
12ea0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
12eb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12ec0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
12ed0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12ee0 70 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e  p);.  if( (p->in
12ef0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
12f00 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74  TE) || pBt->inSt
12f10 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  mt ){.    rc = p
12f20 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
12f30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
12f40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
12f60 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
12f70 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
12f80 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ITE );.    rc = 
12f90 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
12fa0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
12fb0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
12fc0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  n(pBt->pPager);.
12fd0 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
12fe0 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
12ff0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13000 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13010 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
13020 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
13030 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
13040 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
13050 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
13060 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
13070 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
13080 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
13090 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
130a0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
130b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
130c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
130d0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
130e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
130f0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
13100 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
13110 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13120 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
13130 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  it(pBt->pPager);
13140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
13150 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13160 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  }.  pBt->inStmt 
13170 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
13180 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
131a0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
131b0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
131c0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
131d0 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
131e0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
131f0 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
13200 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13210 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
13220 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
13230 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
13240 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
13250 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
13260 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
13270 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
13280 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
13290 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
132a0 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
132b0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
132c0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
132d0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
132e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
132f0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
13300 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13310 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13320 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  r(p);.  sqlite3M
13330 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b  allocDisallow();
13340 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
13350 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
13360 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
13370 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13380 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
13390 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
133a0 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
133b0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
133c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
133d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
133e0 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29  te3MallocAllow()
133f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13400 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13420 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70  Default key comp
13430 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
13440 74 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f  to be used if no
13450 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
13460 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69  tion.** is speci
13470 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69  fied on the sqli
13480 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
13490 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
134a0 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65   int dfltCompare
134b0 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
134c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
134d0 2a 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e  * User data is n
134e0 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
134f0 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   n1, const void 
13500 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  *p1,    /* First
13510 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
13520 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e  */.  int n2, con
13530 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20  st void *p2     
13540 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f  /* Second key to
13550 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20   compare */.){. 
13560 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65   int c;.  c = me
13570 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c  mcmp(p1, p2, n1<
13580 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20  n2 ? n1 : n2);. 
13590 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
135a0 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
135b0 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
135c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
135d0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
135e0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
135f0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
13600 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
13610 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
13620 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
13630 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
13640 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
13650 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
13660 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
13670 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
13680 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
13690 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
136a0 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
136b0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
136c0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
136d0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
136e0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
136f0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
13700 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
13710 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
13720 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
13730 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
13740 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
13750 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
13760 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
13770 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
13780 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
13790 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
137a0 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
137b0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
137c0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
137d0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
137e0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
137f0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
13800 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
13810 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
13820 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
13830 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
13840 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
13850 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
13860 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
13870 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
13880 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
13890 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
138a0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
138b0 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
138c0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
138d0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
138e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
138f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
13900 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
13910 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
13920 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
13930 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
13940 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
13950 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
13960 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
13970 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13980 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
13990 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
139a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
139b0 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
139c0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
139d0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
139e0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
139f0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
13a00 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
13a10 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
13a20 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73   logically the s
13a30 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ame for every cu
13a40 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72  rsor.** on a par
13a50 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
13a60 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d  Changing the com
13a70 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13a80 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
13a90 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65  in incorrect ope
13aa0 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  rations.  If the
13ab0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
13ac0 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a  tion is NULL, a.
13ad0 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61  ** default compa
13ae0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
13af0 73 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d  s used.  The com
13b00 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13b10 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67   is.** always ig
13b20 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59  nored for INTKEY
13b30 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
13b40 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
13b50 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
13b90 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
13bd0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
13be0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13c10 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
13c20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
13c30 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
13c40 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13c50 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13c60 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
13c70 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
13c80 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
13cb0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
13cc0 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
13cd0 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
13d00 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
13d10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
13d20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
13d30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13d40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
13d50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
13d60 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
13d70 20 29 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20 30   );.  *ppCur = 0
13d80 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
13d90 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  {.    if( pBt->r
13da0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
13db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
13dc0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
13dd0 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64     if( checkRead
13de0 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
13df0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
13e00 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
13e10 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
13e20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
13e30 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
13e40 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
13e50 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  y(p);.    if( rc
13e60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13e70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
13e90 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
13ea0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rFlag ){.      r
13eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
13ec0 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
13ed0 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
13ee0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
13ef0 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20  eof(*pCur) );.  
13f00 69 66 28 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20  if( pCur==0 ){. 
13f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
13f20 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63  OMEM;.    goto c
13f30 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
13f40 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43  eption;.  }.  pC
13f50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
13f60 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69  Pgno)iTable;.  i
13f70 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
13f80 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13f90 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
13fa0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  r)==0 ){.    rc 
13fb0 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
13fc0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
13fd0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
13fe0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
13ff0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
14000 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
14010 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30   &pCur->pPage, 0
14020 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
14040 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
14050 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
14060 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
14070 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
14080 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
14090 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
140a0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
140b0 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68  riables, link th
140c0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
140d0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20  e BtShared list 
140e0 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28  and set *ppCur (
140f0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  the.  ** output 
14100 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
14110 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f   function)..  */
14120 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72  .  pCur->xCompar
14130 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20  e = xCmp ? xCmp 
14140 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20  : dfltCompare;. 
14150 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41   pCur->pArg = pA
14160 72 67 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  rg;.  pCur->pBtr
14170 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
14180 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
14190 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c  r->wrFlag = wrFl
141a0 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
141b0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
141c0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
141d0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
141e0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
141f0 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
14200 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
14210 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
14220 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
14230 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20 70 43 75  ;.  *ppCur = pCu
14240 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r;..  return SQL
14250 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
14260 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
14270 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14280 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14290 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
142a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
142b0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f  Cur);.  }.  unlo
142c0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
142d0 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pBt);.  return r
142e0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
142f0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
14300 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14330 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
14340 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
14370 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
14380 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
14390 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
143c0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
143d0 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  ly */.  int (*xC
143e0 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
143f0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
14400 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b  nst void*), /* K
14410 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey Comparison fu
14420 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
14430 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14450 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
14460 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
14470 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70  /.  BtCursor **p
14480 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
144b0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
144c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
144d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
144e0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
144f0 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
14500 72 46 6c 61 67 2c 20 78 43 6d 70 2c 20 70 41 72  rFlag, xCmp, pAr
14510 67 2c 20 70 70 43 75 72 29 3b 0a 20 20 73 71 6c  g, ppCur);.  sql
14520 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14530 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14540 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
14550 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
14560 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
14570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
14580 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
14590 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
145a0 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
145b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
145c0 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
145d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
145e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
145f0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 42 74 72 65  Cur->pBt;.  Btre
14600 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
14610 2d 3e 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c  ->pBtree;..  sql
14620 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14630 42 74 72 65 65 29 3b 0a 20 20 63 6c 65 61 72 43  Btree);.  clearC
14640 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
14650 75 72 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur);.  if( pCur-
14660 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 43  >pPrev ){.    pC
14670 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
14680 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
14690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
146a0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
146b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
146c0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
146d0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
146e0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
146f0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72 65  >pPrev;.  }.  re
14700 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
14710 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b  pPage);.  unlock
14720 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
14730 74 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65  t);.  invalidate
14740 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
14750 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ur);.  sqlite3_f
14760 72 65 65 28 70 43 75 72 29 3b 0a 20 20 73 71 6c  ree(pCur);.  sql
14770 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14780 42 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  Btree);.  return
14790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
147a0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70  *.** Make a temp
147b0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20  orary cursor by 
147c0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66  filling in the f
147d0 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75  ields of pTempCu
147e0 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72  r..** The tempor
147f0 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ary cursor is no
14800 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  t on the cursor 
14810 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72  list for the Btr
14820 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
14830 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
14840 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
14850 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
14860 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 61 73 73  pTempCur){.  ass
14870 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
14880 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
14890 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
148a0 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a  , pCur, sizeof(*
148b0 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  pCur));.  pTempC
148c0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
148d0 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
148e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d   = 0;.  if( pTem
148f0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
14900 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14910 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
14920 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
14930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
14940 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
14950 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
14960 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
14970 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
14980 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
14990 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
149a0 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
149b0 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
149c0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
149d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
149e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
149f0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  );.  if( pCur->p
14a00 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Page ){.    sqli
14a10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
14a20 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61  ur->pPage->pDbPa
14a30 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
14a40 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14a50 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
14a60 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
14a70 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
14a80 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
14a90 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
14aa0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
14ab0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c  lid, call.** sql
14ac0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
14ad0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
14ae0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
14af0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
14b00 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
14b10 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
14b20 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
14b30 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
14b40 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
14b50 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
14b60 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
14b70 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
14b80 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
14b90 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
14ba0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
14bb0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
14bc0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
14bd0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
14be0 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
14bf0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
14c00 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
14c10 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
14c20 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
14c30 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
14c40 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
14c50 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
14c60 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
14c70 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
14c80 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
14c90 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
14ca0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
14cb0 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
14cc0 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
14cd0 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
14ce0 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
14cf0 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
14d00 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
14d10 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
14d20 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
14d30 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
14d40 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
14d50 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
14d60 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
14d70 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
14d80 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
14d90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
14da0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
14db0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
14dc0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
14dd0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
14de0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
14df0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
14e00 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
14e10 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
14e20 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
14e30 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
14e40 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
14e50 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
14e60 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
14e70 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
14e80 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
14e90 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
14ea0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
14eb0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
14ec0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
14ed0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14ee0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
14ef0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
14f00 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69  r->idx, &pCur->i
14f10 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nfo);.    }else{
14f20 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
14f30 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
14f40 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
14f50 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
14f60 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
14f70 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
14f80 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
14f90 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
14fa0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
14fb0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
14fc0 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
15000 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
15010 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  \.    sqlite3Btr
15050 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
15060 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
15070 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dx, &pCur->info)
15080 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65  ;         \.  }e
15090 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
150e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15120 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
15130 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SC_VER */../*.**
15140 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
15150 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
15160 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
15170 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
15180 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
15190 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
151a0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
151b0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
151c0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
151d0 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
151e0 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
151f0 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
15200 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
15210 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
15220 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
15230 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
15240 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
15250 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
15260 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
15270 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
15280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15290 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
152a0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
152b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
152c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
152d0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
152e0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
152f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
15300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15310 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
15320 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15330 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
15340 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
15350 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
15360 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15370 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
15380 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
15390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
153a0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
153b0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
153c0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
153d0 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
153e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
153f0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
15400 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
15410 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
15420 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
15430 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
15440 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
15450 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   Always return S
15460 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69  QLITE_OK..** Fai
15470 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
15480 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75  ible.  If the cu
15490 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
154a0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
154b0 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77  g to an entry (w
154c0 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c  hich can happen,
154d0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
154e0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
154f0 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20   is empty) then 
15500 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
15510 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
15520 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
15530 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15540 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  u32 *pSize){.  i
15550 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
15560 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
15570 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
15580 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
15590 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
155a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
155b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
155c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
155d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
155e0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
155f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
15600 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
15610 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15620 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
15630 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69        /* Not poi
15640 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
15650 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53   entry - set *pS
15660 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20  ize to 0. */.   
15670 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
15680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15690 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
156a0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
156b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
156c0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
156d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
156e0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
156f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
15700 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
15710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
15720 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
15730 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
15740 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
15750 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
15760 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
15770 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
15780 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
15790 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
157a0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
157b0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
157c0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
157d0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
157e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
157f0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
15800 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
15810 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
15820 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
15830 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
15840 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e  erwise:.**.** Un
15850 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69  less pPgnoNext i
15860 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65  s NULL, the page
15870 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
15880 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ext overflow .**
15890 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
158a0 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74  ked list is writ
158b0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
158c0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a  t. If page ovfl.
158d0 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  ** is the last p
158e0 61 67 65 20 69 6e 20 69 74 27 73 20 6c 69 6e 6b  age in it's link
158f0 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ed list, *pPgnoN
15900 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
15910 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
15920 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
15930 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  , *ppPage is set
15940 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a   to the MemPage*
15950 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70   handle.** for p
15960 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e  age ovfl. The un
15970 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70  derlying pager p
15980 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  age may have bee
15990 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77  n requested.** w
159a0 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e  ith the noConten
159b0 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74  t flag set, so t
159c0 68 65 20 70 61 67 65 20 64 61 74 61 20 61 63 63  he page data acc
159d0 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74  essable via.** t
159e0 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e  his handle may n
159f0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a  ot be trusted..*
15a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
15a10 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
15a20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
15a30 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a50 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
15a60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
15a70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
15a80 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
15a90 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
15aa0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
15ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15ac0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
15ad0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
15ae0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
15af0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
15b00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15b10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15b20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
15b30 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73  One of these mus
15b40 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f  t not be NULL. O
15b50 74 68 65 72 77 69 73 65 2c 20 77 68 79 20 63 61  therwise, why ca
15b60 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
15b70 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70  ? */.  assert(pp
15b80 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78  Page || pPgnoNex
15b90 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67  t);..  /* If pPg
15ba0 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20  noNext is NULL, 
15bb0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
15bc0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
15bd0 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a  ed to obtain.  *
15be0 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66  * a MemPage* ref
15bf0 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20  erence only. No 
15c00 70 61 67 65 2d 64 61 74 61 20 69 73 20 72 65 71  page-data is req
15c10 75 69 72 65 64 20 69 6e 20 74 68 69 73 20 63 61  uired in this ca
15c20 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se..  */.  if( !
15c30 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20  pPgnoNext ){.   
15c40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
15c50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
15c60 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31   ovfl, ppPage, 1
15c70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
15c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15c90 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
15ca0 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
15cb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
15cc0 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
15cd0 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
15ce0 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
15cf0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
15d00 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
15d10 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
15d20 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
15d30 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
15d40 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
15d50 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
15d60 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
15d70 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
15d80 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
15d90 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
15da0 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
15db0 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
15dc0 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
15dd0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
15de0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
15df0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
15e00 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
15e10 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
15e20 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
15e30 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
15e40 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
15e50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
15e60 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
15e70 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
15e80 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
15e90 73 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  s<=sqlite3PagerP
15ea0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
15eb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
15ec0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
15ed0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
15ee0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
15ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15f20 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
15f30 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
15f40 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
15f50 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
15f60 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
15f70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
15f80 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d  dif..  if( next=
15f90 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a  =0 || ppPage ){.
15fa0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
15fb0 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  ge = 0;..    rc 
15fc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
15fd0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
15fe0 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30   &pPage, next!=0
15ff0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63  );.    assert(rc
16000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
16010 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66  Page==0);.    if
16020 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d  ( next==0 && rc=
16030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16040 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
16050 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
16060 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
16070 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
16080 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
16090 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
160a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
160b0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
160c0 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  }.  *pPgnoNext =
160d0 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e   next;..  return
160e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
160f0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
16100 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
16110 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
16120 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
16130 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
16140 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
16150 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
16160 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
16170 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
16180 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
16190 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
161a0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
161b0 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
161c0 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
161d0 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
161e0 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
161f0 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
16200 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16210 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
16220 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
16230 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
16240 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
16250 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
16260 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
16270 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
16280 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
16290 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
162a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
162b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
162c0 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
162d0 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
162e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
162f0 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
16300 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16320 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
16330 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
16340 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16350 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16360 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
16370 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
16380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
16390 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
163a0 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
163b0 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
163c0 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
163d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
163e0 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
163f0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
16400 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
16410 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
16420 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
16430 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
16440 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
16450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16460 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
16470 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16480 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
16490 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
164a0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
164b0 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
164c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
164d0 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
164e0 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
164f0 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
16500 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
16510 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
16520 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16540 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16550 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
16560 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
16570 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
16580 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
16590 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
165a0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
165b0 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
165c0 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
165d0 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
165e0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
165f0 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
16600 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
16610 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
16620 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
16630 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
16640 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
16650 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
16660 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
16670 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
16680 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
16690 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
166a0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
166b0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
166c0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
166d0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
166e0 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
166f0 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
16700 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
16710 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72  just reads or wr
16720 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20  ites bytes from 
16730 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
16740 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a  .  Data might .*
16750 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  * appear on the 
16760 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
16770 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
16780 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
16790 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a  ow .** pages..**
167a0 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
167b0 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
167c0 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
167d0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
167e0 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
167f0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
16800 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
16810 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
16820 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
16830 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
16840 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
16850 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
16860 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
16870 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
16880 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
16890 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
168a0 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
168b0 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
168c0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
168d0 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
168e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
168f0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
16900 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
16910 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
16920 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
16930 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
16940 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
16950 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
16960 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
16970 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
16980 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
16990 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
169a0 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
169b0 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
169c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
169d0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
169e0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
169f0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
16a00 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
16a10 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
16a20 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
16a30 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
16a40 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
16a50 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
16a60 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
16a70 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
16a80 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
16a90 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
16aa0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
16ab0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
16ac0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
16ad0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
16ae0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
16af0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
16b00 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
16b10 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
16b20 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e   payload */.  in
16b30 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
16b40 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
16b50 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
16b60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
16b70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
16b80 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
16b90 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
16ba0 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20  nt skipKey,     
16bb0 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65      /* offset be
16bc0 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20  gins at data if 
16bd0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
16be0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
16bf0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
16c00 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
16c10 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
16c20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
16c30 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
16c40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16c50 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
16c60 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
16c70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
16c80 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20   pCur->pPage;   
16c90 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20    /* Btree page 
16ca0 6f 66 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  of current curso
16cb0 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53  r entry */.  BtS
16cc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
16cd0 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 2f  r->pBt;        /
16ce0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
16cf0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
16d00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
16d10 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
16d20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16d30 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
16d40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
16d50 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
16d60 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
16d70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
16d80 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  et>=0 );.  asser
16d90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
16da0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
16db0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
16dc0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
16dd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
16de0 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
16df0 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
16e00 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
16e10 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   0 : pCur->info.
16e20 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b  nKey);..  if( sk
16e30 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
16e40 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
16e50 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
16e60 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
16e70 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20  nfo.nData ){.   
16e80 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
16e90 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
16ea0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16eb0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
16ec0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
16ed0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16ee0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
16ef0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
16f00 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
16f10 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
16f20 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
16f30 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
16f40 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
16f50 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
16f60 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
16f70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
16f80 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
16f90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
16fa0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
16fb0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
16fc0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
16fd0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
16fe0 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
16ff0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
17000 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
17010 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
17020 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
17030 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
17040 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
17050 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
17060 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
17070 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
17080 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  t ovflSize = pBt
17090 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
170a0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
170b0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
170c0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
170d0 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
170e0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
170f0 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
17100 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
17110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17120 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
17130 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
17140 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
17150 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
17160 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
17170 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
17180 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
17190 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
171a0 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
171b0 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
171c0 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
171d0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
171e0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
171f0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
17200 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
17210 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
17220 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
17230 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
17240 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
17250 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
17260 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
17270 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
17280 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
17290 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
172a0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
172b0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
172c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
172d0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
172e0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
172f0 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
17300 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
17310 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
17320 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
17330 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
17340 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
17350 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
17360 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
17370 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
17380 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
17390 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70   if( nOvfl && !p
173a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
173b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
173c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
173d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
173e0 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
173f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17400 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
17410 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
17420 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
17430 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
17440 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
17450 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
17460 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
17470 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
17480 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
17490 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
174a0 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
174b0 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
174c0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
174d0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
174e0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
174f0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17500 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
17510 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
17520 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
17530 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
17540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17550 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
17560 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
17570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17580 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
17590 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
175a0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
175b0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
175c0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
175d0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
175e0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
175f0 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
17600 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
17610 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
17620 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
17630 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
17640 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
17650 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
17660 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
17670 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
17680 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
17690 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
176a0 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
176b0 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
176c0 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
176d0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
176e0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
176f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
17700 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
17710 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17720 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17730 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
17740 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
17750 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
17760 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17770 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
17780 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
17790 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
177a0 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
177b0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
177c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
177d0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
177e0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
177f0 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
17800 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
17810 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
17820 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
17830 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
17840 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
17850 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
17860 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
17870 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
17880 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
17890 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
178a0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
178b0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
178c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
178d0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
178e0 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
178f0 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
17900 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
17910 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
17920 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
17930 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
17940 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
17950 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17960 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
17970 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
17980 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
17990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
179a0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
179b0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
179c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
179d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
179e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
179f0 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
17a00 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
17a10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17a20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
17a30 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
17a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17a50 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
17a60 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
17a70 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
17a80 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
17a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17aa0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
17ab0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
17ac0 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
17ad0 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
17ae0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17af0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
17b00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
17b10 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
17b20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
17b30 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
17b40 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += a;.        }.
17b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17b60 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
17b70 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
17b80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17b90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17ba0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
17bb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
17bc0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
17bd0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
17be0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
17bf0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
17c00 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
17c10 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
17c20 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
17c30 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
17c40 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
17c50 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
17c60 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
17c70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17c80 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
17c90 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
17ca0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
17cb0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
17cc0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
17cd0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
17ce0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
17cf0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
17d00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
17d10 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
17d20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
17d30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
17d40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
17d50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
17d60 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
17d70 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
17d80 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
17d90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17da0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17db0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17dc0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
17dd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
17de0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
17df0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
17e00 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
17e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17e20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
17e30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
17e40 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
17e50 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
17e60 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
17e70 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
17e80 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
17e90 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
17ea0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
17eb0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
17ec0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
17ed0 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
17ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17ef0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
17f00 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
17f10 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
17f20 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
17f30 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
17f40 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
17f50 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
17f60 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
17f70 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
17f80 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
17f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
17fa0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
17fb0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
17fc0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
17fd0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
17fe0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
17ff0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18000 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18010 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18030 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
18040 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
18050 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
18060 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
18070 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
18080 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
18090 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
180a0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
180b0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
180c0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
180d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
180e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
180f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18100 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18110 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18120 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18130 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18140 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
18150 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
18160 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
18170 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18180 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
18190 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
181a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
181b0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
181c0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
181d0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
181e0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
181f0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
18200 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
18210 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
18220 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
18230 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
18240 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
18250 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
18260 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18270 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
18280 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
18290 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
182a0 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
182b0 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
182c0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
182d0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
182e0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
182f0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
18300 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
18310 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
18320 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
18330 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
18340 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
18350 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
18360 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
18370 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
18380 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
18390 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
183a0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
183b0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
183c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
183d0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
183e0 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
183f0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
18400 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
18410 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
18420 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
18430 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
18440 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
18450 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
18460 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79  ed to reassembly
18470 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
18480 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
18490 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
184a0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
184b0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
184c0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
184d0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
184e0 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
184f0 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
18500 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
18510 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
18520 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
18530 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
18540 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
18550 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
18560 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
18570 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
18580 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
18590 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
185a0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
185b0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
185c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
185d0 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
185e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
185f0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
18600 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
18610 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
18620 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
18630 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
18640 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
18650 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
18660 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
18670 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
18680 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
18690 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   int nLocal;..  
186a0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
186b0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  && pCur->pPage!=
186c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
186d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
186e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
186f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18700 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18710 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
18720 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
18730 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18740 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
18750 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
18760 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
18770 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
18780 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
18790 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
187a0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
187b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
187c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
187d0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
187e0 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
187f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
18800 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
18810 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
18820 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
18830 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
18840 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
18850 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
18860 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
18870 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
18880 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
18890 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
188a0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
188b0 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
188c0 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
188d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
188e0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
188f0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
18900 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
18910 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
18920 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
18930 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
18940 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
18950 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
18960 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
18970 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
18980 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
18990 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
189a0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
189b0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
189c0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
189d0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
189e0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
189f0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
18a00 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
18a10 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
18a20 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
18a30 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
18a40 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
18a50 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
18a60 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
18a70 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
18a80 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
18a90 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
18aa0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
18ab0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
18ac0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
18ad0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
18ae0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
18af0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
18b00 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
18b10 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
18b20 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
18b30 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
18b40 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
18b50 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
18b60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
18b70 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
18b80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18b90 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
18ba0 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
18bb0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
18bc0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
18bd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18be0 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
18bf0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
18c00 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
18c10 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
18c20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
18c30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
18c40 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
18c50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18c60 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
18c70 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
18c80 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
18c90 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
18ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18cb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
18cc0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
18cd0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
18ce0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
18cf0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
18d00 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
18d10 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
18d20 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
18d30 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
18d40 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
18d50 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
18d60 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
18d70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
18d80 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
18d90 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
18da0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
18db0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
18dc0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18dd0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
18de0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18df0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18e00 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
18e10 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
18e20 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
18e30 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
18e40 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18e50 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
18e60 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
18e70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
18e80 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
18e90 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
18ea0 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
18eb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
18ec0 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
18ed0 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
18ee0 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
18ef0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
18f00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
18f10 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
18f20 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
18f30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18f40 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
18f50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18f60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
18f70 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
18f80 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
18f90 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
18fa0 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
18fb0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
18fc0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
18fd0 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
18fe0 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
18ff0 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
19000 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
19010 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
19020 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
19030 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
19040 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
19050 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
19060 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
19070 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
19080 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
19090 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
190a0 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
190b0 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
190c0 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
190d0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
190e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
190f0 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
19100 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19110 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
19120 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
19130 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
19140 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
19150 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
19160 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
19170 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
19180 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
19190 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
191a0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
191b0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
191c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
191d0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
191e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
191f0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
19200 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
19210 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19220 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
19230 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
19240 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
19250 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
19260 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
19270 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
19280 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
19290 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
192a0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
192b0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
192c0 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
192d0 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
192e0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
192f0 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
19300 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
19310 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
19320 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
19330 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
19340 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
19350 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19360 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19370 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19380 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19390 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65  VALID );.  pPage
193a0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
193b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
193c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
193d0 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
193e0 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
193f0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
19400 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
19410 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
19420 3d 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e  =0 );.  idxParen
19430 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  t = pPage->idxPa
19440 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  rent;.  sqlite3P
19450 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
19460 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c  >pDbPage);.  rel
19470 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
19480 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
19490 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72   pParent;.  pCur
194a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
194b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
194c0 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30  ent->idxShift==0
194d0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20   );.  pCur->idx 
194e0 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a  = idxParent;.}..
194f0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19500 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
19510 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
19520 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
19530 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
19540 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
19550 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
19560 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
19570 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
19580 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
19590 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
195a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
195b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
195c0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
195d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45  State==CURSOR_RE
195e0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
195f0 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
19600 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a  tion(pCur);.  }.
19610 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
19620 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f  pPage;.  if( pRo
19630 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e  ot && pRoot->pgn
19640 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
19650 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
19660 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29   pRoot->isInit )
19670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19680 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  f( .      SQLITE
19690 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e  _OK!=(rc = getAn
196a0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
196b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
196c0 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29  pRoot, 0)).    )
196d0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
196e0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
196f0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
19700 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19710 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
19720 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
19730 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52  pCur->pPage = pR
19740 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  oot;.  }.  pCur-
19750 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
19760 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
19770 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
19780 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
19790 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
197a0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
197b0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
197c0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
197d0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
197e0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
197f0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
19800 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
19810 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
19820 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
19830 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
19840 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
19850 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
19860 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ge);.  }.  pCur-
19870 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72  >eState = ((pCur
19880 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
19890 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
198a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
198b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
198c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
198d0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
198e0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
198f0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
19900 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
19910 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
19920 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
19930 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
19940 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
19950 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
19960 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
19970 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
19980 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
19990 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
199a0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
199b0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
199c0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
199d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
199e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
199f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
19a00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
19a10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
19a20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19a30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
19a40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
19a50 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
19a60 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
19a70 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
19a80 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
19a90 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
19aa0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
19ab0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
19ac0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
19ad0 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20  pCur->idx));.   
19ae0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
19af0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
19b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19b10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
19b20 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19b30 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
19b40 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
19b50 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
19b60 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
19b70 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
19b80 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
19b90 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
19ba0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
19bb0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
19bc0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
19bd0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
19be0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
19bf0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
19c00 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
19c10 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
19c20 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
19c30 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
19c40 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
19c50 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
19c60 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
19c70 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
19c80 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
19c90 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
19ca0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
19cb0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
19cc0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19cd0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
19ce0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
19cf0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
19d00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19d10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
19d20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19d30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19d40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19d50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19d60 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
19d70 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
19d80 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
19d90 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
19da0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
19db0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
19dc0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
19dd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
19de0 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70     pCur->idx = p
19df0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
19e00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
19e10 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
19e20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
19e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
19e40 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d  ur->idx = pPage-
19e50 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20  >nCell - 1;.    
19e60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
19e70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
19e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19e90 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
19ea0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
19eb0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
19ec0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
19ed0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
19ee0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
19ef0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
19f00 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
19f10 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
19f20 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
19f30 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
19f40 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
19f50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19f60 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
19f70 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
19f80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
19f90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19fa0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19fb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19fc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
19fd0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  ur->pBtree->pSql
19fe0 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
19ff0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1a000 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1a010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a020 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1a030 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1a040 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
1a050 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a060 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1a070 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1a080 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a090 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1a0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1a0b0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a0c0 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
1a0d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1a0e0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1a0f0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1a100 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a110 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1a120 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
1a130 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1a140 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1a150 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1a160 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1a170 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1a180 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1a190 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1a1a0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1a1b0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1a1c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1a1d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a1e0 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
1a1f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1a200 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
1a210 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1a220 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1a230 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a240 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1a250 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  ur->pBtree->pSql
1a260 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
1a270 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1a280 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1a290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a2a0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1a2b0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1a2c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1a2d0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a2e0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1a2f0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1a300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a310 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1a320 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a330 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1a340 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1a350 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1a360 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
1a370 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a380 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1a390 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1a3a0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1a3b0 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b  try near pKey/nK
1a3c0 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ey..** Return a 
1a3d0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1a3e0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1a3f0 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  ables, only the 
1a400 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  nKey parameter i
1a410 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
1a420 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
1a430 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20  r other tables, 
1a440 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62  nKey is the numb
1a450 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1a460 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20  ata.** in pKey. 
1a470 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
1a480 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
1a490 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  ed when the curs
1a4a0 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65  or was.** create
1a4b0 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  d is used to com
1a4c0 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  pare keys..**.**
1a4d0 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
1a4e0 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
1a4f0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1a500 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
1a510 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1a520 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
1a530 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
1a540 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
1a550 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
1a560 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
1a570 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
1a580 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
1a590 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
1a5a0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1a5b0 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1a5c0 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
1a5d0 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
1a5e0 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72  which the.** cur
1a5f0 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  sor is written t
1a600 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21  o *pRes if pRes!
1a610 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e  =NULL.  The mean
1a620 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76  ing of.** this v
1a630 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f  alue is as follo
1a640 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
1a650 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
1a660 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1a670 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1a680 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1a690 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
1a6a0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79  maller than pKey
1a6b0 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
1a6c0 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
1a6e0 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
1a6f0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
1a700 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
1a710 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1a720 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
1a730 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1a740 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1a750 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a760 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
1a770 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a   matches pKey..*
1a780 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
1a790 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1a7a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1a7b0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1a7c0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1a7d0 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
1a7e0 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a   than pKey..**.*
1a7f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a800 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
1a810 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1a820 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1a830 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
1a840 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1a850 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1a860 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  key content for 
1a870 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73  indices.  Not us
1a880 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a  ed by tables */.
1a890 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
1a8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a8b0 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68   of pKey.  Or th
1a8c0 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  e key for tables
1a8d0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1a8e0 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ght,         /* 
1a8f0 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1a900 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1a910 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1a920 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1a930 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72       /* Search r
1a940 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b  esult flag */.){
1a950 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a960 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a970 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a980 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a990 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1a9a0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
1a9b0 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
1a9c0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1a9d0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1a9e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1a9f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1aa00 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
1aa10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1aa20 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1aa30 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1aa40 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1aa50 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1aa60 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1aa70 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1aa80 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
1aa90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aaa0 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  .  }.  for(;;){.
1aab0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
1aac0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
1aad0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
1aae0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1aaf0 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  age;.    int c =
1ab00 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
1ab10 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
1ab20 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
1ab30 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
1ab40 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
1ab50 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1ab60 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
1ab70 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b  ey && pKey==0 ){
1ab80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ab90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1aba0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
1abb0 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
1abc0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1abd0 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1abe0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1abf0 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20  = (upr+lwr)/2;. 
1ac00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72     }.    if( lwr
1ac10 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b  <=upr ) for(;;){
1ac20 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65  .      void *pCe
1ac30 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34  llKey;.      i64
1ac40 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1ac50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1ac60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
1ac70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1ac80 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1ac90 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1aca0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1acb0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1acc0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1acd0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1ace0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1acf0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1ad00 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1ad10 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1ad20 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1ad30 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
1ad40 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1ad50 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1ad60 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20   *)&nCellKey);. 
1ad70 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1ad80 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1ad90 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1ada0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1adb0 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b  nCellKey>nKey ){
1adc0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1add0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1ade0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1adf0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1ae00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae10 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1ae20 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1ae30 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1ae40 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1ae50 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1ae60 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1ae70 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1ae80 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1ae90 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1aea0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1aeb0 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
1aec0 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
1aed0 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1aee0 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
1aef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1af00 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1af10 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  y = sqlite3_mall
1af20 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  oc( nCellKey );.
1af30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1af40 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  ellKey==0 ) retu
1af50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1af60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1af70 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
1af80 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  pCur, 0, nCellKe
1af90 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c  y, (void *)pCell
1afa0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1afb0 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
1afc0 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
1afd0 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1afe0 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
1aff0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b000 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
1b010 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b020 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1b030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b050 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b060 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1b070 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1b080 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61  leafData && !pPa
1b090 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1b0a0 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1b0b0 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  ->idx;.         
1b0c0 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
1b0d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b0e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1b0f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
1b100 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a  es ) *pRes = 0;.
1b110 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b130 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b140 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1b150 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75         lwr = pCu
1b160 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20  r->idx+1;.      
1b170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
1b180 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31  pr = pCur->idx-1
1b190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b1a0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
1b1b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
1b1d0 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  ->idx = (lwr+upr
1b1e0 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  )/2;.    }.    a
1b1f0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
1b200 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1b210 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1b220 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1b230 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
1b240 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
1b250 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
1b260 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1b270 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1b280 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1b290 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1b2a0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
1b2b0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
1b2c0 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
1b2d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
1b2e0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1b2f0 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
1b300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1b310 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
1b320 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61  r->idx<pCur->pPa
1b330 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1b340 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1b350 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
1b360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b370 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1b380 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20  >idx = lwr;.    
1b390 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b3a0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
1b3b0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1b3c0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
1b3d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
1b3e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1b3f0 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43   }.  /* NOT REAC
1b400 48 45 44 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  HED */.}.../*.**
1b410 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1b420 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1b430 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b440 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1b450 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1b460 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1b470 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1b480 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1b490 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1b4a0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1b4b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1b4c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1b4d0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1b4e0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1b4f0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1b500 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1b510 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1b520 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b530 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1b540 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1b550 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1b560 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1b570 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1b580 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1b590 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1b5a0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1b5b0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1b5c0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1b5d0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1b5e0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1b5f0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1b600 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1b610 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1b620 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1b630 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1b640 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1b650 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b660 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1b670 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1b680 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1b690 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1b6a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1b6b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b6c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1b6d0 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65  >pBtree->pSqlite
1b6e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
1b6f0 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65  turn pCur->pBtre
1b700 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 7d 0a 0a 2f  e->pSqlite;.}../
1b710 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1b720 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1b730 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1b740 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1b750 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1b760 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1b770 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1b780 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1b790 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1b7a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1b7b0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1b7c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1b7d0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1b7e0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1b7f0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1b800 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1b810 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1b820 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1b830 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1b840 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b850 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b860 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1b870 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
1b880 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1b890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b8a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1b8b0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1b8c0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50   pRes!=0 );.  pP
1b8d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1b8e0 65 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  e;.  if( CURSOR_
1b8f0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1b900 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1b910 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1b920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b930 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1b940 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip>0 ){.    pCur
1b950 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1b960 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1b970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b980 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1b990 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  p = 0;..  assert
1b9a0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1b9b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b9c0 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
1b9d0 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
1b9e0 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69  idx++;.  pCur->i
1b9f0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1ba00 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
1ba10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1ba20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1ba30 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1ba40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1ba50 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1ba60 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1ba70 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1ba80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1ba90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1baa0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1bab0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1bac0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1bad0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1bae0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1baf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
1bb00 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
1bb10 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1bb20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1bb30 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1bb40 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1bb50 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
1bb60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1bb70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1bb80 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1bb90 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1bba0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1bbb0 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1bbc0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1bbd0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1bbe0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1bbf0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1bc00 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
1bc10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1bc20 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1bc30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bc50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1bc60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1bc70 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1bc80 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1bc90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bca0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1bcb0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1bcc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bcd0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1bce0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1bcf0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1bd00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1bd10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bd20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bd30 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4e 65 78  .  rc = btreeNex
1bd40 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
1bd50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1bd60 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
1bd70 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
1bd80 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
1bd90 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
1bda0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1bdb0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1bdc0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1bdd0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1bde0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1bdf0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
1be00 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1be10 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1be20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1be30 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1be40 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73  et *pRes=1..*/.s
1be50 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
1be60 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
1be70 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1be80 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1be90 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d  Pgno pgno;.  Mem
1bea0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1beb0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1bec0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1bed0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1bee0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
1bef0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1bf00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bf10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1bf20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52  c;.  }.  if( CUR
1bf30 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1bf40 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1bf50 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1bf60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
1bf80 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20  ->skip<0 ){.    
1bf90 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1bfa0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1bfb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bfc0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
1bfd0 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50  >skip = 0;..  pP
1bfe0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1bff0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
1c000 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1c010 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1c020 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  x>=0 );.  if( !p
1c030 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c040 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1c050 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e( findCell(pPag
1c060 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b  e, pCur->idx) );
1c070 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1c080 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1c090 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1c0a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c0b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1c0c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1c0d0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
1c0e0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
1c0f0 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ->idx==0 ){.    
1c100 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
1c110 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61  eeIsRootPage(pPa
1c120 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ge) ){.        p
1c130 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1c140 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1c150 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1c160 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c180 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c190 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
1c1a0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
1c1b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1c1c0 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ge;.    }.    pC
1c1d0 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70  ur->idx--;.    p
1c1e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1c1f0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
1c200 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
1c210 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c220 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c230 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1c240 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1c250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c270 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
1c280 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1c290 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
1c2a0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
1c2b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1c2c0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1c2d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
1c2e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1c2f0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
1c300 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
1c310 2c 20 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72  , pRes);.  retur
1c320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1c330 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
1c340 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
1c350 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1c360 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
1c370 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1c380 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
1c390 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
1c3a0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
1c3b0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1c3c0 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
1c3d0 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
1c3e0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
1c3f0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
1c400 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
1c410 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
1c420 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1c430 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
1c440 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
1c450 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
1c460 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
1c470 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c480 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1c490 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
1c4a0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1c4b0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
1c4c0 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
1c4d0 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
1c4e0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
1c4f0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
1c500 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
1c510 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c520 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
1c530 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1c540 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
1c550 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
1c560 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
1c570 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
1c580 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1c590 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
1c5a0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
1c5b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
1c5c0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
1c5d0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
1c5e0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
1c5f0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
1c600 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
1c610 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
1c620 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
1c630 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
1c640 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
1c650 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
1c660 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
1c670 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1c680 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
1c690 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
1c6a0 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
1c6b0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1c6c0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
1c6d0 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
1c6e0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1c6f0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
1c700 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1c710 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
1c720 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
1c730 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1c740 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1c750 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
1c760 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
1c770 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
1c780 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
1c790 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
1c7a0 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
1c7b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
1c7c0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
1c7d0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1c7e0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1c7f0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  freelist */.  in
1c800 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t k;     /* Numb
1c810 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
1c820 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
1c830 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
1c840 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
1c850 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1c860 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a  PrevTrunk = 0;..
1c870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c880 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1c890 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
1c8a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1c8b0 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
1c8c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1c8d0 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
1c8e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
1c8f0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
1c900 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
1c910 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
1c920 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
1c930 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
1c940 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
1c950 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
1c960 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
1c970 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
1c980 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
1c990 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
1c9a0 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
1c9b0 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
1c9c0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
1c9d0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
1c9e0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
1c9f0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
1ca00 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1ca10 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
1ca20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
1ca30 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
1ca40 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
1ca50 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
1ca60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ca70 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1ca80 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
1ca90 79 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  y<=sqlite3PagerP
1caa0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1cab0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 75  ager) ){.      u
1cac0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
1cad0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
1cae0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1caf0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1cb00 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
1cb10 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
1cb20 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
1cb30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1cb40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cb50 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1cb60 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1cb70 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1cb80 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
1cb90 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
1cba0 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
1cbb0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
1cbc0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
1cbd0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
1cbe0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
1cbf0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
1cc00 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
1cc10 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
1cc20 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
1cc30 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
1cc40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1cc50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1cc60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1cc70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1cc80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
1cc90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1cca0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
1ccb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
1ccc0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
1ccd0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
1cce0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
1ccf0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
1cd00 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
1cd10 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
1cd20 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
1cd30 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
1cd40 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
1cd50 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
1cd60 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1cd70 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
1cd80 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
1cd90 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
1cda0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
1cdb0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
1cdc0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1cdd0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
1cde0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
1cdf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ce00 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1ce10 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1ce20 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
1ce30 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1ce40 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1ce50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
1ce60 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
1ce70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1ce80 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1ce90 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1cea0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1ceb0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1cec0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
1ced0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
1cee0 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
1cef0 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
1cf00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1cf10 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
1cf20 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
1cf30 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
1cf40 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
1cf50 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
1cf60 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
1cf70 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
1cf80 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
1cf90 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
1cfa0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
1cfb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
1cfc0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
1cfd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1cfe0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1cff0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1d000 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1d010 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1d020 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1d030 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1d040 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
1d050 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
1d060 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1d070 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1d080 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d090 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1d0a0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1d0b0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1d0c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1d0d0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1d0e0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1d0f0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1d100 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
1d110 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e  else if( k>pBt->
1d120 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1d130 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
1d140 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
1d150 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
1d160 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1d170 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1d180 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d190 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
1d1a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1d1b0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
1d1c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d1d0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
1d1e0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
1d1f0 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
1d200 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d210 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
1d220 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
1d230 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
1d240 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1d250 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
1d260 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
1d270 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
1d280 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
1d290 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1d2a0 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
1d2b0 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
1d2c0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1d2d0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1d2e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
1d2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1d300 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1d310 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1d320 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1d330 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1d340 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1d350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d360 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
1d370 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
1d380 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1d390 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1d3a0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1d3b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1d3c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
1d3d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1d3e0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
1d3f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
1d400 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1d410 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1d420 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1d430 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1d440 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
1d450 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1d460 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
1d470 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
1d480 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
1d490 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
1d4a0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
1d4b0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
1d4c0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
1d4d0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1d4e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1d4f0 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
1d500 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
1d510 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
1d520 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1d530 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1d540 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  8]);.          r
1d550 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1d560 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65  GetPage(pBt, iNe
1d570 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
1d580 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
1d590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d5b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1d5c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1d5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d5f0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
1d600 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1d610 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d630 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1d640 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
1d650 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1d660 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d670 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
1d680 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d690 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1d6a0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
1d6b0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1d6c0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d6d0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1d6e0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
1d6f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1d700 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1d710 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
1d720 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
1d730 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
1d740 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
1d750 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
1d760 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1d770 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1d780 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1d790 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
1d7a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1d7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d7c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d7d0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
1d7e0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d800 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1d810 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d820 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1d830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d840 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d850 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1d860 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
1d870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d890 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1d8a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1d8b0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
1d8c0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
1d8d0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
1d8e0 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
1d8f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d900 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
1d910 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
1d920 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  unk */.        i
1d930 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  nt closest;.    
1d940 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
1d950 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1d960 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
1d970 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
1d980 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d990 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1d9a0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1d9b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1d9d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1d9e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1d9f0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
1da00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1da10 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20  nt i, dist;.    
1da20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1da30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  0;.          dis
1da40 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  t = get4byte(&aD
1da50 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
1da60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1da70 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
1da80 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  -dist;.         
1da90 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
1daa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1dab0 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79   int d2 = get4by
1dac0 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
1dad0 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1dae0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30          if( d2<0
1daf0 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20   ) d2 = -d2;.   
1db00 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1db10 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
1db20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1db30 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
1db40 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
1db50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1db70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1db80 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1db90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
1dba0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1dbb0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
1dbc0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  *4]);.        if
1dbd0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
1dbe0 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
1dbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  {.          *pPg
1dc00 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
1dc10 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
1dc20 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  >sqlite3PagerPag
1dc30 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1dc40 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
1dc50 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20     /* Free page 
1dc60 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1dc70 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  he file */.     
1dc80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1dc90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1dca0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
1dcb0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
1dcc0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
1dcd0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
1dce0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
1dd00 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
1dd10 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
1dd20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
1dd30 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
1dd40 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
1dd50 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1dd60 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
1dd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1dd80 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
1dd90 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
1dda0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
1ddb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ddc0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
1ddd0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1dde0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ddf0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1de00 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1de10 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ge, 1);.        
1de20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1de30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1de40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
1de50 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70  ontRollback((*pp
1de60 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
1de70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1de80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1de90 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
1dea0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1deb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1dec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ded0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1dee0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1def0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1df00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1df10 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1df20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1df30 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
1df40 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1df50 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
1df60 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
1df70 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
1df80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1df90 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
1dfa0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1dfb0 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
1dfc0 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
1dfd0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
1dfe0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1dff0 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65   *pPgno = sqlite
1e000 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1e010 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31  pBt->pPager) + 1
1e020 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1e030 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e040 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  M.    if( pBt->n
1e050 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f  Trunc ){.      /
1e060 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d  * An incr-vacuum
1e070 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
1e080 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
1e090 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65  nsaction. So the
1e0a0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74  .      ** page t
1e0b0 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f  o allocate is no
1e0c0 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69  t from the physi
1e0d0 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66  cal end of the f
1e0e0 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a  ile, but.      *
1e0f0 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63  * at pBt->nTrunc
1e100 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1e110 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
1e120 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20  nTrunc+1;.      
1e130 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
1e140 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e150 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a  t) ){.        (*
1e160 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20  pPgno)++;.      
1e170 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1e180 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1e190 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
1e1a0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
1e1b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
1e1c0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
1e1d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e1e0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
1e1f0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
1e200 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
1e210 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
1e220 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
1e230 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
1e240 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
1e250 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
1e260 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
1e270 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
1e280 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
1e290 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43     */.      TRAC
1e2a0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1e2b0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
1e2c0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
1e2d0 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
1e2e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e2f0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1e300 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e310 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  );.      (*pPgno
1e320 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  )++;.    }.    i
1e330 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29  f( pBt->nTrunc )
1e340 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1e350 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20  unc = *pPgno;.  
1e360 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1e370 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1e380 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e390 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
1e3a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1e3b0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1e3c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
1e3d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e3e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1e3f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e400 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1e410 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1e420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e430 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1e440 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1e450 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
1e460 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
1e470 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
1e480 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
1e490 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1e4a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1e4b0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
1e4c0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
1e4d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1e4e0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
1e4f0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1e500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e510 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61  ../*.** Add a pa
1e520 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1e530 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66  se file to the f
1e540 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73  reelist..**.** s
1e550 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e560 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64  () is NOT called
1e570 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
1e580 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
1e590 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
1e5a0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
1e5b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1e5c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e5d0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1e5e0 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
1e5f0 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
1e600 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
1e610 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
1e620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e630 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1e640 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1e650 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
1e660 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  o>1 );.  pPage->
1e670 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65  isInit = 0;.  re
1e680 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 2d  leasePage(pPage-
1e690 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61  >pParent);.  pPa
1e6a0 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
1e6b0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1e6c0 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
1e6d0 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
1e6e0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1e6f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1e700 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
1e710 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e720 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  c;.  n = get4byt
1e730 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e740 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
1e750 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e760 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66  [36], n+1);..#if
1e770 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
1e780 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
1e790 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
1e7a0 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
1e7b0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
1e7c0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
1e7d0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
1e7e0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
1e7f0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
1e800 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
1e810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e820 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
1e830 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1e840 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1e850 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
1e860 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
1e870 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
1e880 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1e890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e8a0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
1e8b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
1e8c0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
1e8d0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
1e8e0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
1e8f0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
1e900 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
1e910 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
1e920 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1e930 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1e940 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
1e950 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
1e960 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
1e970 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1e980 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1e990 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
1e9a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1e9b0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1e9c0 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20  free page */.   
1e9d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e9e0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
1e9f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1ea00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1ea10 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
1ea20 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b  e->aData, 0, 8);
1ea30 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
1ea40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1ea50 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1ea60 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
1ea70 2d 50 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c  -PAGE: %d first\
1ea80 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
1ea90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1eaa0 2f 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70 61  /* Other free pa
1eab0 67 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  ges already exis
1eac0 74 2e 20 20 52 65 74 72 69 76 65 20 74 68 65 20  t.  Retrive the 
1ead0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
1eae0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
1eaf0 72 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64  reelist and find
1eb00 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65   out how many le
1eb10 61 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a  aves it has. */.
1eb20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72      MemPage *pTr
1eb30 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  unk;.    rc = sq
1eb40 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1eb50 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
1eb60 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1eb70 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  2]), &pTrunk, 0)
1eb80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1eb90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20  eturn rc;.    k 
1eba0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1ebb0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1ebc0 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75     if( k>=pBt->u
1ebd0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
1ebe0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1ebf0 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20  trunk is full.  
1ec00 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65  Turn the page be
1ec10 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61  ing freed into a
1ec20 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72   new.      ** tr
1ec30 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f  unk page with no
1ec40 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20   leaves. */.    
1ec50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ec60 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
1ec70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ec80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ec90 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  rc;.      put4by
1eca0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1ecb0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a   pTrunk->pgno);.
1ecc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ecd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
1ece0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1ecf0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1ed00 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
1ed10 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43  gno);.      TRAC
1ed20 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1ed30 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
1ed40 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
1ed50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ed60 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72  pPage->pgno, pTr
1ed70 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
1ed80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1ed90 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66   Add the newly f
1eda0 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c  reed page as a l
1edb0 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65  eaf on the curre
1edc0 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  nt trunk */.    
1edd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ede0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1edf0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ee00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ee10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
1ee20 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1ee30 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a  aData[4], k+1);.
1ee40 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1ee50 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1ee60 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70  8+k*4], pPage->p
1ee70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
1ee80 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1ee90 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  TE.        sqlit
1eea0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1eeb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1eec0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1eed0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
1eee0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
1eef0 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
1ef00 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
1ef10 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
1ef20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
1ef30 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
1ef40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ef50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
1ef60 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
1ef70 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1ef80 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
1ef90 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1efa0 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
1efb0 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
1efc0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
1efd0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1efe0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1eff0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1f000 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
1f010 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1f020 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f  t nOvfl;.  int o
1f030 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
1f040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f050 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1f060 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1f070 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
1f080 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1f090 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1f0a0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
1f0b0 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
1f0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f0d0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
1f0e0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
1f0f0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1f100 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
1f110 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
1f120 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1f130 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
1f140 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
1f150 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1f160 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
1f170 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
1f180 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
1f190 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
1f1a0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
1f1b0 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
1f1c0 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
1f1d0 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
1f1e0 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  - ){.    MemPage
1f1f0 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28   *pOvfl;.    if(
1f200 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
1f210 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ovflPgno>sqlite3
1f220 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1f230 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1f240 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f250 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1f270 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1f280 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
1f290 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d  &pOvfl, (nOvfl==
1f2a0 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b  0)?0:&ovflPgno);
1f2b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f2c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1f2d0 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c  = freePage(pOvfl
1f2e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1f2f0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
1f300 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1f310 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1f320 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f330 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f340 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
1f350 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
1f360 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
1f370 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
1f380 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
1f390 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
1f3a0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
1f3b0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
1f3c0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
1f3d0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
1f3e0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
1f3f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1f400 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
1f410 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1f420 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
1f430 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
1f440 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
1f450 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
1f460 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
1f470 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
1f480 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
1f490 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
1f4a0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
1f4b0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
1f4c0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
1f4d0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
1f4e0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
1f4f0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
1f500 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1f510 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
1f520 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
1f530 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
1f540 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
1f550 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
1f560 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
1f570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1f580 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1f590 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
1f5a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1f5b0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
1f5c0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
1f5d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
1f5e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1f5f0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
1f600 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
1f610 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
1f620 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
1f630 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
1f640 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f660 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
1f670 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
1f680 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
1f690 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
1f6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1f6b0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
1f6c0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
1f6d0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
1f6e0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
1f6f0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
1f700 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
1f710 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
1f720 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f730 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
1f740 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f750 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
1f760 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
1f770 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
1f780 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1f790 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
1f7a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
1f7b0 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
1f7c0 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
1f7d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f7e0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1f7f0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1f800 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
1f810 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
1f820 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
1f830 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1f840 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
1f850 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
1f860 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
1f870 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
1f880 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
1f890 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
1f8a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1f8b0 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
1f8c0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
1f8d0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1f8e0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
1f8f0 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73  u64*)&nKey);.  s
1f900 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
1f910 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
1f920 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1f930 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
1f940 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
1f950 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1f960 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
1f970 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
1f980 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20  ta==nData+nZero 
1f990 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
1f9a0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
1f9b0 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
1f9c0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
1f9d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1f9e0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
1f9f0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
1fa00 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
1fa10 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
1fa20 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
1fa30 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20   nKey;.    pSrc 
1fa40 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
1fa50 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a   = nKey;.  }.  *
1fa60 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
1fa70 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
1fa80 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
1fa90 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
1faa0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
1fab0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
1fac0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
1fad0 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
1fae0 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
1faf0 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
1fb00 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61  .      int isExa
1fb10 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ct = 0;.#ifndef 
1fb20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fb30 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
1fb40 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
1fb50 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
1fb60 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1fb70 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
1fb80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1fb90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1fba0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
1fbb0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
1fbc0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
1fbd0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
1fbe0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1fbf0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
1fc00 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
1fc10 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fc20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1fc30 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c      if( pgnoOvfl
1fc40 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1fc50 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20  /* isExact = 1; 
1fc60 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
1fc70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fc80 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1fc90 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1fca0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
1fcb0 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61   pgnoOvfl, isExa
1fcc0 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
1fcd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fce0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
1fcf0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
1fd00 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
1fd10 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
1fd20 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
1fd30 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
1fd40 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
1fd50 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
1fd60 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
1fd70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
1fd80 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
1fd90 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
1fda0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
1fdb0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
1fdc0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1fdd0 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
1fde0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
1fdf0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
1fe00 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
1fe10 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
1fe20 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
1fe30 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
1fe40 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
1fe50 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
1fe60 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
1fe70 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
1fe80 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
1fe90 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
1fea0 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e  alised values an
1feb0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
1fec0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
1fed0 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
1fee0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
1fef0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1ff00 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
1ff10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ff20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
1ff30 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
1ff40 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
1ff50 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
1ff60 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
1ff70 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
1ff80 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
1ff90 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20  Ptrmap);.       
1ffa0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ffb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ffc0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
1ffd0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1ffe0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
1fff0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
20000 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
20010 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20020 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
20030 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
20040 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
20050 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20060 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
20070 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
20080 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
20090 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
200a0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
200b0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
200c0 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
200d0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
200e0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
200f0 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
20100 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
20110 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
20120 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
20130 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
20140 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20  ceLeft;.    if( 
20150 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
20160 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
20170 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
20180 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
20190 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
201a0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
201b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
201c0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
201d0 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
201e0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
201f0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
20200 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
20210 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
20220 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
20230 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
20240 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
20250 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
20260 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
20270 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
20280 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
20290 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
202a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
202b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d  * Change the Mem
202c0 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69  Page.pParent poi
202d0 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65  nter on the page
202e0 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73   whose number is
202f0 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  .** given in the
20300 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20310 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65   so that MemPage
20320 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74  .pParent holds t
20330 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e  he.** pointer in
20340 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
20350 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
20360 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  nt reparentPage(
20370 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
20380 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67  gno pgno, MemPag
20390 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69  e *pNewParent, i
203a0 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61  nt idx){.  MemPa
203b0 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50  ge *pThis;.  DbP
203c0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
203d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
203e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
203f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
20400 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21  ert( pNewParent!
20410 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  =0 );.  if( pgno
20420 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20430 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20440 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ( pBt->pPager!=0
20450 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
20460 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
20470 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
20480 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
20490 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69  Page ){.    pThi
204a0 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  s = (MemPage *)s
204b0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
204c0 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
204d0 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49    if( pThis->isI
204e0 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nit ){.      ass
204f0 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74  ert( pThis->aDat
20500 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65 72  a==(sqlite3Pager
20510 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
20520 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
20530 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70  This->pParent!=p
20540 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  NewParent ){.   
20550 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
20560 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65  pParent ) sqlite
20570 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69  3PagerUnref(pThi
20580 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  s->pParent->pDbP
20590 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54  age);.        pT
205a0 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
205b0 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
205c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
205d0 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  ef(pNewParent->p
205e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
205f0 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
20600 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
20610 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20620 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
20630 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ge);.  }..#ifnde
20640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20650 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
20660 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20670 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
20680 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
20690 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
206a0 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
206b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
206c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
206d0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
206e0 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
206f0 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
20700 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
20710 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
20720 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
20730 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
20740 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
20750 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
20760 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
20770 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
20780 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
20790 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
207a0 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
207b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
207c0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
207d0 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
207e0 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
207f0 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  o.** another..*/
20800 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61  .static int repa
20810 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d  rentChildPages(M
20820 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
20830 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61    int i;.  BtSha
20840 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
20850 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
20860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20880 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
20890 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
208a0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
208b0 61 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  af ) return SQLI
208c0 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d  TE_OK;..  for(i=
208d0 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
208e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
208f0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
20900 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
20910 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
20920 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
20930 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74  reparentPage(pBt
20940 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
20950 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ), pPage, i);.  
20960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20970 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
20980 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
20990 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
209a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61  ){.    rc = repa
209b0 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65  rentPage(pBt, ge
209c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
209d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
209e0 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20  ffset+8]), .    
209f0 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20     pPage, i);.  
20a00 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
20a10 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
20a20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20a30 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
20a40 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
20a50 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
20a60 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
20a70 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
20a80 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
20a90 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
20aa0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
20ab0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
20ac0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
20ad0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
20ae0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
20af0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
20b00 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
20b10 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
20b20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
20b30 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
20b40 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
20b50 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
20b60 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
20b70 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
20b80 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
20b90 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
20ba0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
20bb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20bc0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
20bd0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
20be0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
20bf0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
20c00 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
20c10 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
20c20 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
20c30 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
20c40 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
20c50 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
20c60 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20  hin data[] */.. 
20c70 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
20c80 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
20c90 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
20ca0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
20cb0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
20cc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
20cd0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
20ce0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
20cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20d00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20d10 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
20d20 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
20d30 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
20d40 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
20d50 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
20d60 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
20d70 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
20d80 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
20d90 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
20da0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
20db0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
20dc0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
20dd0 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
20de0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
20df0 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
20e00 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
20e10 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
20e20 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
20e30 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
20e40 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
20e50 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
20e60 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
20e70 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
20e80 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
20e90 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
20ea0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
20eb0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
20ec0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
20ed0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
20ee0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
20ef0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
20f00 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
20f10 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
20f20 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
20f30 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
20f40 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
20f50 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
20f60 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
20f70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
20f80 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
20f90 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
20fa0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
20fb0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
20fc0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
20fd0 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
20fe0 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
20ff0 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
21000 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
21010 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
21020 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
21030 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
21040 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
21050 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
21060 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
21070 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
21080 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
21090 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
210a0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
210b0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
210c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
210d0 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
210e0 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
210f0 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
21100 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
21110 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
21120 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
21130 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
21140 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
21150 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
21160 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
21170 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
21180 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
21190 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
211a0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
211b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
211c0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
211d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
211e0 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
211f0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
21200 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
21210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
21220 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
21230 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
21240 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
21250 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
21260 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
21270 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
21280 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
21290 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
212a0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
212b0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
212c0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
212d0 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
212e0 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
212f0 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
21300 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
21310 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
21320 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
21330 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
21340 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
21350 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
21360 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
21370 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
21380 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
21390 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
213a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
213b0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
213c0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
213d0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
213e0 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
213f0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
21400 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
21410 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
21420 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
21430 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
21440 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
21450 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
21460 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
21470 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
21480 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
21490 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
214a0 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
214b0 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
214c0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
214d0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
214e0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
214f0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
21500 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
21510 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
21520 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
21530 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
21540 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
21550 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
21560 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
21570 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
21580 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
21590 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
215a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
215b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
215c0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
215d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
215e0 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
215f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21600 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
21610 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
21620 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
21630 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
21640 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
21650 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
21660 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
21670 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
21680 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
21690 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
216a0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
216b0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
216c0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
216d0 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67  t( j<sizeof(pPag
216e0 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
216f0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
21700 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
21710 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
21720 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
21730 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
21740 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = i;.    pPage->
21750 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nFree = 0;.  }el
21760 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
21770 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21780 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
21790 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
217a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
217b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
217c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
217d0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
217e0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
217f0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
21800 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
21810 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50  ta;.    hdr = pP
21820 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
21830 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
21840 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
21850 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
21860 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
21870 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
21880 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
21890 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b  Page->nCell + 2;
218a0 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
218b0 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
218c0 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d   if( end > top -
218d0 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20   sz ){.      rc 
218e0 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
218f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
21900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21910 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21920 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
21930 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
21940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21950 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
21960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
21970 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
21980 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
21990 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
219a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
219b0 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
219c0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
219d0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
219e0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
219f0 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
21a00 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
21a10 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
21a20 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
21a30 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
21a40 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
21a50 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
21a60 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
21a70 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
21a80 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
21a90 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
21aa0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
21ab0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
21ac0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
21ad0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
21ae0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
21af0 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e  xShift = 1;.#ifn
21b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21b10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
21b20 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
21b30 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
21b40 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
21b50 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
21b60 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
21b70 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
21b80 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
21b90 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
21ba0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
21bb0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
21bc0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
21bd0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
21be0 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
21bf0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
21c00 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
21c10 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61   &info);.      a
21c20 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
21c30 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
21c40 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
21c50 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
21c60 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66  ;.      if( (inf
21c70 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
21c80 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
21c90 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
21ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
21cb0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
21cc0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
21cd0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
21ce0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
21cf0 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
21d00 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
21d10 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
21d20 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
21d30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21d40 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
21d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21d60 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
21d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21d80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
21d90 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
21da0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
21db0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
21dc0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
21dd0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
21de0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
21df0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
21e00 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
21e10 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
21e20 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
21e30 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
21e40 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
21e50 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
21e60 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
21e70 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
21e80 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
21e90 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
21ea0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
21eb0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
21ec0 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20 20  /.  int *aSize  
21ed0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
21ee0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
21ef0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
21f00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21f10 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
21f20 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
21f30 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
21f40 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
21f50 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
21f60 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
21f70 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
21f80 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
21f90 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
21fa0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
21fb0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
21fc0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
21fd0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
21fe0 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
21ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
22000 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
22010 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
22020 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
22030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22040 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22050 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22060 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  x) );.  totalSiz
22070 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
22080 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
22090 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
220a0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
220b0 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
220c0 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
220d0 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
220e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
220f0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c  ell==0 );.  cell
22100 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
22110 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
22120 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
22130 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
22140 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
22150 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
22160 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  ], nCell);.  if(
22170 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65   nCell ){.    ce
22180 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74  llbody = allocat
22190 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f  eSpace(pPage, to
221a0 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  talSize);.    as
221b0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30  sert( cellbody>0
221c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
221d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
221e0 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  2*nCell );.    p
221f0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
22200 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28  *nCell;.    for(
22210 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
22220 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79  +){.      put2by
22230 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72  te(&data[cellptr
22240 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
22250 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
22260 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
22270 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
22280 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20  ;.      cellptr 
22290 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c  += 2;.      cell
222a0 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  body += aSize[i]
222b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
222c0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
222d0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
222e0 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50  Size );.  }.  pP
222f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  age->nCell = nCe
22300 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
22310 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
22320 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
22330 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
22340 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
22350 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
22360 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
22370 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
22380 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
22390 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
223a0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
223b0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
223c0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
223d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
223e0 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
223f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
22400 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
22410 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
22420 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
22430 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
22440 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
22450 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
22460 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
22470 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
22480 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
22490 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
224a0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
224b0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
224c0 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
224d0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
224e0 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
224f0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
22500 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
22510 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
22520 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
22530 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
22540 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
22550 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
22560 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
22570 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
22580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22590 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
225a0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
225b0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
225c0 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
225d0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
225e0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
225f0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f  alance */../* Fo
22600 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
22610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
22620 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20  lance(MemPage*, 
22630 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  int);..#ifndef S
22640 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
22650 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
22660 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
22670 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
22680 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
22690 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
226a0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
226b0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
226c0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
226d0 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
226e0 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
226f0 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
22700 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
22710 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
22720 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
22730 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
22740 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
22750 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
22760 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
22770 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
22780 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
22790 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
227a0 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
227b0 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
227c0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
227d0 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
227e0 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
227f0 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
22800 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
22810 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
22820 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
22830 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
22840 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
22850 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
22860 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
22870 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
22880 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
22890 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
228a0 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
228b0 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
228c0 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
228d0 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
228e0 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
228f0 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
22900 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
22910 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
22920 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
22930 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
22940 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
22950 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
22960 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
22970 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
22980 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65   *pPage, MemPage
22990 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e   *pParent){.  in
229a0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
229b0 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67  *pNew;.  Pgno pg
229c0 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65  noNew;.  u8 *pCe
229d0 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c  ll;.  int szCell
229e0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
229f0 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  o;.  BtShared *p
22a00 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
22a10 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
22a20 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
22a30 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
22a40 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
22a50 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
22a60 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a80 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
22a90 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
22aa0 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
22ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22ac0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
22ad0 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
22ae0 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
22af0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22b00 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
22b10 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
22b20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
22b30 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
22b40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
22b50 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
22b60 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
22b70 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
22b80 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
22b90 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
22ba0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
22bb0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
22bc0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
22bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22bf0 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
22c00 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
22c10 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
22c20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
22c30 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
22c40 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
22c50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
22c60 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
22c70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
22c80 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
22c90 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
22ca0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
22cb0 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
22cc0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
22cd0 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
22ce0 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
22cf0 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
22d00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
22d10 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
22d20 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
22d30 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
22d40 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
22d50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
22d60 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  is.  ** so that 
22d70 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
22d80 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
22d90 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
22da0 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69  and.  ** pPage i
22db0 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
22dc0 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f  ght child. .  */
22dd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22de0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70  ->nCell>0 );.  p
22df0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
22e00 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
22e10 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  ell-1);.  sqlite
22e20 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
22e30 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
22e40 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20   &info);.  rc = 
22e50 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
22e60 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  nt, parentCell, 
22e70 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
22e80 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69   0, 0, &parentSi
22e90 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
22ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22eb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22ec0 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53   assert( parentS
22ed0 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d  ize<64 );.  rc =
22ee0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
22ef0 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20  ent, parentIdx, 
22f00 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65  parentCell, pare
22f10 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20  ntSize, 0, 4);. 
22f20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22f30 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
22f40 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62   rc;.  }.  put4b
22f50 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
22f60 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72  Cell(pParent,par
22f70 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e  entIdx), pPage->
22f80 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74  pgno);.  put4byt
22f90 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
22fa0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
22fb0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
22fc0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22fd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22fe0 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  UM.  /* If this 
22ff0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
23000 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
23010 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
23020 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  ap.  ** with ent
23030 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
23040 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
23050 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
23060 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68  .  ** cell on th
23070 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
23080 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
23090 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
230a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
230b0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
230c0 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
230d0 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
230e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
230f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23100 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
23110 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
23120 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
23130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23140 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
23150 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20  ePage(pNew);.   
23160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23170 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
23180 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
23190 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
231a0 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62  e new page and b
231b0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
231c0 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20  t page,.  ** in 
231d0 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72  case the divider
231e0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63   cell inserted c
231f0 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f  aused it to beco
23200 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a  me overfull..  *
23210 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  /.  releasePage(
23220 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
23230 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
23240 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   0);.}.#endif /*
23250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
23260 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
23270 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23280 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43   redistributes C
23290 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e  ells on pPage an
232a0 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62  d up to NN*2 sib
232b0 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67  lings.** of pPag
232c0 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  e so that all pa
232d0 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
232e0 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  he same amount o
232f0 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a  f free space..**
23300 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c   Usually NN sibl
23310 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73  ings on either s
23320 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20  ide of pPage is 
23330 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
23340 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68  ncing,.** though
23350 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d   more siblings m
23360 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
23370 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65  ne side if pPage
23380 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
23390 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
233a0 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49  f its parent.  I
233b0 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65  f pPage has fewe
233c0 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c  r than 2*NN sibl
233d0 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69  ings.** (somethi
233e0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
233f0 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67  y happen if pPag
23400 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  e is the root pa
23410 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c  ge or a .** chil
23420 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20  d of root) then 
23430 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
23440 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61  blings participa
23450 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
23460 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
23470 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
23480 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74  s of pPage might
23490 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
234a0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
234b0 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61  e or.** two in a
234c0 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
234d0 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
234e0 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
234f0 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70  full. The root p
23500 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61  age.** is specia
23510 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64  l and is allowed
23520 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d   to be nearly em
23530 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73  pty. If pPage is
23540 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61   .** the root pa
23550 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70  ge, then the dep
23560 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d  th of the tree m
23570 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
23580 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65  d.** or decrease
23590 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63  d by one, as nec
235a0 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20  essary, to keep 
235b0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72  the root page fr
235c0 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72  om being.** over
235d0 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65  full or complete
235e0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ly empty..**.** 
235f0 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
23600 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
23610 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
23620 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he Cells on pPag
23630 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
23640 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
23650 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  d in pPage->aDat
23660 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68  a[].  This can h
23670 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
23680 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
23690 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a  .  Part of the j
236a0 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
236b0 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65  ne is to.** make
236c0 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20   sure all Cells 
236d0 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61  for pPage once a
236e0 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67  gain fit in pPag
236f0 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a  e->aData[]..**.*
23700 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
23710 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
23720 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
23730 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f  ge, the parent o
23740 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  f pPage.** might
23750 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
23760 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20   or underfull.  
23770 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c  If that happens,
23780 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
23790 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
237a0 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
237b0 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  he parent..**.**
237c0 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
237d0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
237e0 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
237f0 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
23800 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
23810 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20  pted state.  So 
23820 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
23830 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
23840 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
23850 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
23860 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
23870 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50  nce_nonroot(MemP
23880 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
23890 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
238a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
238b0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
238c0 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
238d0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
238e0 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
238f0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23900 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23920 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
23930 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
23940 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
23950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
23960 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
23970 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
23980 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
23990 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
239a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
239b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
239c0 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
239d0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
239e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
239f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
23a00 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
23a10 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
23a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23a30 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
23a40 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
23a50 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
23a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23a70 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
23a80 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23aa0 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
23ab0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
23ac0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
23ad0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
23ae0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
23af0 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
23b00 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
23b10 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
23b40 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
23b50 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
23b60 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
23b70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
23b80 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
23b90 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23bb0 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
23bc0 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
23bd0 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
23be0 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23c00 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
23c10 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
23c20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
23c30 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
23c40 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
23c50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
23c60 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
23c90 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
23ca0 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
23cb0 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20  nt iSpace = 0;  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23cd0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
23ce0 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a   of aSpace[] */.
23cf0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
23d00 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
23d10 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
23d20 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
23d30 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
23d40 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
23d50 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
23d60 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
23d70 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
23d80 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
23d90 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
23da0 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
23db0 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
23dc0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
23dd0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
23de0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
23df0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
23e00 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
23e10 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
23e20 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
23e30 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
23e40 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
23e50 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
23e60 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e80 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
23e90 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
23ea0 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
23eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23ec0 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
23ed0 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
23ee0 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
23ef0 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
23f00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
23f10 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
23f20 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
23f30 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
23f40 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
23f50 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
23f60 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
23f70 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a  ced */.  int *sz
23f80 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
23f90 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
23fa0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
23fb0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
23fc0 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23fe0 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
23ff0 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f  ing data of apCo
24000 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  py[] */.  u8 *aS
24010 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
24020 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
24030 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f  to hold copies o
24040 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
24050 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
24060 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24070 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d  UM.  u8 *aFrom =
24080 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   0;.#endif..  as
24090 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
240a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
240b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
240c0 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
240d0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
240e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
240f0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
24100 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24110 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
24120 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
24130 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  e) || pPage->nOv
24140 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70  erflow==1 );.  p
24150 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
24160 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
24170 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
24180 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
24190 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
241a0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
241b0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
241c0 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
241d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
241e0 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
241f0 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
24200 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
24210 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
24220 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
24230 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
24240 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
24250 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ANCE.  /*.  ** A
24260 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   special case:  
24270 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68  If a new entry h
24280 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
24290 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a  erted into a.  *
242a0 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73  * table (that is
242b0 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69  , a btree with i
242c0 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20  nteger keys and 
242d0 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20  all data at the 
242e0 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64  leaves).  ** and
242f0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
24300 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
24310 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
24320 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20  ee (it has the. 
24330 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29   ** largest key)
24340 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70   then use the sp
24350 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75  ecial balance_qu
24360 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ick() routine fo
24370 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  r.  ** balancing
24380 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  .  balance_quick
24390 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65  () is much faste
243a0 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e  r and results in
243b0 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20   a tighter.  ** 
243c0 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20  packing of data 
243d0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
243e0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
243f0 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20  Page->leaf &&.  
24400 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
24410 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  y &&.      pPage
24420 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20 20  ->leafData &&.  
24430 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
24440 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20  flow==1 &&.     
24450 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
24460 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  .idx==pPage->nCe
24470 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ll &&.      pPag
24480 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
24490 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74  !=1 &&.      get
244a0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
244b0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
244c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50  drOffset+8])==pP
244d0 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20  age->pgno.  ){. 
244e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     /*.    ** TOD
244f0 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62  O: Check the sib
24500 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66  lings to the lef
24510 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d  t of pPage. It m
24520 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a  ay be that.    *
24530 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66  * they are not f
24540 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70  ull and no new p
24550 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e  age is required.
24560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
24570 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  rn balance_quick
24580 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  (pPage, pParent)
24590 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
245a0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
245b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
245c0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
245d0 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
245e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
245f0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
24600 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
24610 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
24620 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
24630 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
24640 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
24650 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
24660 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
24670 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
24680 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
24690 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
246a0 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
246b0 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
246c0 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
246d0 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
246e0 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
246f0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
24700 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
24710 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
24720 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
24730 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
24740 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72  Page) );.    for
24750 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72  (idx=0; idx<pPar
24760 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b  ent->nCell; idx+
24770 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65  +){.      if( ge
24780 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
24790 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d  pParent, idx))==
247a0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
247b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
247c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
247d0 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
247e0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
247f0 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
24800 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
24810 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
24820 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d  8])==pgno );.  }
24830 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20  else{.    idx = 
24840 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
24850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
24860 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69   Initialize vari
24870 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74  ables so that it
24880 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f   will be safe to
24890 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63   jump.  ** direc
248a0 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63  tly to balance_c
248b0 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f  leanup at any mo
248c0 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c  ment..  */.  nOl
248d0 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  d = nNew = 0;.  
248e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
248f0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
24900 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
24910 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
24920 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
24930 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
24940 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
24950 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
24960 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
24970 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
24980 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
24990 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
249a0 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
249b0 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
249c0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
249d0 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
249e0 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
249f0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
24a00 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
24a10 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
24a20 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
24a30 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
24a40 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
24a50 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
24a60 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
24a70 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
24a80 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
24a90 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
24aa0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
24ab0 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
24ac0 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
24ad0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
24ae0 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
24af0 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
24b00 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
24b10 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
24b20 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
24b30 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
24b40 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
24b50 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
24b60 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
24b70 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
24b80 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
24b90 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
24ba0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
24bb0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
24bc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
24bd0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
24be0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
24bf0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
24c00 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
24c10 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24c20 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
24c30 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
24c40 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
24c50 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
24c60 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
24c70 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
24c80 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
24c90 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
24ca0 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
24cb0 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
24cc0 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
24cd0 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
24ce0 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
24cf0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
24d00 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
24d10 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
24d20 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
24d30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
24d40 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
24d50 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72  tiple of 2 in or
24d60 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
24d70 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
24d80 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
24d90 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
24da0 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a  s + 1)&~1;..  /*
24db0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
24dc0 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
24dd0 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
24de0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
24df0 65 33 5f 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e3_malloc( .    
24e00 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
24e10 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
24e40 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
24e50 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20  *sizeof(int)    
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
24e80 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e 44   */.     + ROUND
24e90 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
24ea0 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20 20  ))*NB           
24eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43             /* aC
24ec0 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  opy */.     + pB
24ed0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b 4e  t->pageSize*(5+N
24ee0 42 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B)              
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f00 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20 20   aSpace */.     
24f10 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20  + (ISAUTOVACUUM 
24f20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29  ? nMaxCells : 0)
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f40 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
24f50 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
24f60 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
24f70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
24f80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
24f90 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
24fa0 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
24fb0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
24fc0 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38    aCopy[0] = (u8
24fd0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
24fe0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
24ff0 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38  ((aCopy[0] - (u8
25000 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
25010 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
25020 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
25030 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20  d */.  for(i=1; 
25040 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
25050 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
25060 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
25070 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
25080 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
25090 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
250a0 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[i] - (u8*)apC
250b0 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
250c0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
250d0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
250e0 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20 26    }.  aSpace = &
250f0 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d  aCopy[NB-1][pBt-
25100 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
25110 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
25120 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  )];.  assert( ((
25130 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61 70  aSpace - (u8*)ap
25140 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
25150 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
25160 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
25170 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25180 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25190 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
251a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72  acuum ){.    aFr
251b0 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a 70  om = &aSpace[5*p
251c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
251d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f   }.#endif.  .  /
251e0 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  *.  ** Make copi
251f0 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  es of the conten
25200 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69  t of pPage and i
25210 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f  ts siblings into
25220 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68   aOld[]..  ** Th
25230 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
25240 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
25250 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
25260 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a  opies rather.  *
25270 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
25280 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
25290 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
252a0 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
252b0 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f  e.  ** process o
252c0 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
252d0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ten..  */.  for(
252e0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
252f0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
25300 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  p = apCopy[i] = 
25310 28 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70 79  (MemPage*)&aCopy
25320 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  [i][pBt->pageSiz
25330 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  e];.    p->aData
25340 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42   = &((u8*)p)[-pB
25350 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
25360 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74    memcpy(p->aDat
25370 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
25380 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
25390 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  e + sizeof(MemPa
253a0 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  ge));.    /* The
253b0 20 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65 20   memcpy() above 
253c0 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
253d0 65 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73 6f  e of p->aData so
253e0 20 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20 20   we have to.    
253f0 2a 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e 2e  ** set it again.
25400 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74 61   */.    p->aData
25410 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42   = &((u8*)p)[-pB
25420 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
25430 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  }..  /*.  ** Loa
25440 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
25450 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
25460 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
25470 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
25480 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
25490 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
254a0 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
254b0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
254c0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
254d0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f  pace obtained fo
254e0 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64 20  rm aSpace[] and 
254f0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
25500 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
25510 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
25520 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
25530 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
25540 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
25550 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
25560 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
25570 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
25580 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
25590 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
255a0 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
255b0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
255c0 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  ce[].  In this w
255d0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
255e0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
255f0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
25600 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
25610 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
25620 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
25630 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
25640 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
25650 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
25660 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
25670 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
25680 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
25690 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
256a0 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
256b0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
256c0 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
256d0 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
256e0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
256f0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
25700 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
25710 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
25720 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
25730 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c    nCell = 0;.  l
25740 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
25750 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20  pPage->leaf*4;. 
25760 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67   leafData = pPag
25770 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70  e->leafData && p
25780 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f  Page->leaf;.  fo
25790 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
257a0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
257b0 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
257c0 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  i];.    int limi
257d0 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
257e0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
257f0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
25800 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
25810 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
25820 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
25830 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
25840 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
25850 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
25860 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
25870 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
25880 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
25890 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell]);.#ifndef S
258a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
258b0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
258c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
258d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
258e0 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b  ;.        aFrom[
258f0 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20  nCell] = i;.    
25900 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70      for(a=0; a<p
25910 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  Old->nOverflow; 
25920 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  a++){.          
25930 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  if( pOld->aOvfl[
25940 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c  a].pCell==apCell
25950 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20  [nCell] ){.     
25960 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
25970 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
25980 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
259a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
259b0 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  dif.      nCell+
259c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
259d0 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20   i<nOld-1 ){.   
259e0 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c     int sz = cell
259f0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
25a00 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
25a10 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
25a20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74  {.        /* Wit
25a30 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66  h the LEAFDATA f
25a40 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c  lag, pParent cel
25a50 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54  ls hold only INT
25a60 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20  KEYs that.      
25a70 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61    ** are duplica
25a80 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74  tes of keys on t
25a90 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20  he child pages. 
25aa0 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f   We need to remo
25ab0 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ve.        ** th
25ac0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
25ad0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75  from pParent, bu
25ae0 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63  t the dividers c
25af0 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20  ells are not.   
25b00 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
25b10 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73   apCell[] becaus
25b20 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69  e they are dupli
25b30 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63  cates of child c
25b40 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ells..        */
25b50 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
25b60 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
25b70 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , sz);.      }el
25b80 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  se{.        u8 *
25b90 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  pTemp;.        a
25ba0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
25bb0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
25bc0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
25bd0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54  = sz;.        pT
25be0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
25bf0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
25c00 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
25c10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
25c20 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
25c30 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
25c40 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
25c50 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
25c60 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
25c70 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
25c80 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64  orrection;.#ifnd
25c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25ca0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
25cb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
25cc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
25cd0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
25ce0 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
25cf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
25d00 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
25d10 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
25d20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
25d30 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72  ell] -= leafCorr
25d40 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
25d50 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
25d60 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64  (pTemp)==pgnoOld
25d70 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  [i] );.        i
25d80 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
25d90 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
25da0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
25db0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
25dc0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
25dd0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
25de0 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
25df0 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
25e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
25e10 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
25e20 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
25e30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
25e40 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
25e50 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68  d->aData[pOld->h
25e60 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b  drOffset+8], 4);
25e70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25e80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25e90 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
25ea0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==4 );.         
25eb0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
25ec0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
25ed0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
25ee0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
25ef0 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
25f00 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
25f10 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
25f20 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
25f30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
25f40 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
25f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25f60 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
25f70 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
25f80 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
25f90 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
25fa0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
25fb0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
25fc0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
25fd0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
25fe0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
25ff0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
26000 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
26010 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
26020 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
26030 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
26040 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
26050 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
26060 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
26070 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
26080 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
26090 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
260a0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
260b0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
260c0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
260d0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
260e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
260f0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
26100 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
26110 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
26120 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
26130 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
26140 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
26150 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
26160 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
26170 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
26180 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
26190 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
261a0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
261b0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
261c0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
261d0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
261e0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
261f0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
26200 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
26210 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
26220 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
26230 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
26240 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
26250 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
26260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
26270 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
26280 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
26290 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
262a0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
262b0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
262c0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
262d0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
262e0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
262f0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
26300 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
26310 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
26320 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
26330 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
26340 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
26350 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
26360 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
26370 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
26380 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
26390 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
263a0 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
263b0 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
263c0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
263d0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
263e0 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
263f0 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
26400 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
26410 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
26420 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
26430 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
26440 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
26450 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
26460 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
26470 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
26480 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
26490 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
264a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
264b0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
264c0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
264d0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
264e0 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
264f0 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
26500 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
26510 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
26520 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
26530 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
26540 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
26550 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
26560 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
26570 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
26580 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
26590 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
265a0 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
265b0 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
265c0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
265d0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
265e0 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
265f0 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
26600 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
26610 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
26620 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
26630 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26640 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
26650 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
26660 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26680 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
26690 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
266a0 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
266b0 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
266c0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
266d0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
266e0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
266f0 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
26700 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26710 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
26720 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
26730 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
26740 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
26750 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
26760 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
26770 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
26780 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
26790 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
267a0 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
267b0 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
267c0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
267d0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
267e0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
267f0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
26800 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
26810 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
26820 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
26830 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
26840 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
26850 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
26860 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
26870 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
26880 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
26890 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
268a0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
268b0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
268c0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
268d0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
268e0 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
268f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26900 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
26910 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
26920 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
26930 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
26940 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
26950 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
26960 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
26970 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
26980 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26990 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
269a0 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
269b0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
269c0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
269d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
269e0 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
269f0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
26a00 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
26a10 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
26a20 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
26a30 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
26a40 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
26a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26a60 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
26a70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
26a80 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
26a90 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
26aa0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
26ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
26ac0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
26ad0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
26ae0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
26af0 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
26b00 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
26b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26b20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26b30 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
26b40 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
26b50 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
26b60 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28   }.    zeroPage(
26b70 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
26b80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
26b90 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
26ba0 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
26bb0 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
26bc0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
26bd0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
26be0 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
26bf0 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
26c00 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
26c10 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
26c20 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
26c30 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
26c40 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
26c50 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
26c60 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
26c70 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
26c80 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
26c90 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
26ca0 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
26cb0 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
26cc0 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
26cd0 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
26ce0 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
26cf0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
26d00 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
26d10 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
26d20 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
26d30 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
26d40 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
26d50 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
26d60 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
26d70 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
26d80 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
26d90 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
26da0 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
26db0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
26dc0 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
26dd0 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
26de0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
26df0 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
26e00 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
26e10 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
26e20 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
26e30 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
26e40 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
26e50 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
26e60 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
26e70 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
26e80 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
26e90 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e    int minV = pgn
26ea0 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  oNew[i];.    int
26eb0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
26ec0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
26ed0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
26ee0 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67  gnoNew[j]<(unsig
26ef0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
26f00 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
26f10 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e        minV = pgn
26f20 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  oNew[j];.      }
26f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
26f40 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
26f50 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
26f60 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
26f70 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
26f80 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
26f90 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
26fa0 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d  w[i] = pgnoNew[m
26fb0 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
26fc0 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
26fd0 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  I];.      pgnoNe
26fe0 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20  w[minI] = t;.   
26ff0 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
27000 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
27010 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
27020 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
27030 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28   new: %d(%d) %d(
27040 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
27050 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
27060 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20   pgnoOld[0], .  
27070 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f    nOld>=2 ? pgno
27080 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[1] : 0,.    
27090 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c  nOld>=3 ? pgnoOl
270a0 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67  d[2] : 0,.    pg
270b0 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b  noNew[0], szNew[
270c0 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
270d0 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30  ? pgnoNew[1] : 0
270e0 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
270f0 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
27100 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=3 ? pgnoNew[
27110 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  2] : 0, nNew>=3 
27120 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
27130 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67      nNew>=4 ? pg
27140 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e  noNew[3] : 0, nN
27150 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
27160 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
27170 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a  5 ? pgnoNew[4] :
27180 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
27190 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
271a0 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
271b0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
271c0 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
271d0 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
271e0 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
271f0 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
27200 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
27210 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
27220 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
27230 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
27240 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
27250 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
27260 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
27270 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
27280 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
27290 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
272a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
272b0 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  pNew->pgno==pgno
272c0 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73  New[i] );.    as
272d0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
272e0 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
272f0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
27300 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
27310 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
27320 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
27330 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
27340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
27350 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
27360 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
27370 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27380 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  UM.    /* If thi
27390 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
273a0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
273b0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
273c0 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20   map entries.   
273d0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
273e0 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  o the siblings t
273f0 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e  hat were rearran
27400 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62  ged. These can b
27410 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63  e: left.    ** c
27420 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73  hildren of cells
27430 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  , the right-chil
27440 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f  d of the page, o
27450 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
27460 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  .    ** pointed 
27470 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20  to by cells..   
27480 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
27490 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
274a0 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c       for(k=j; k<
274b0 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b  cntNew[i]; k++){
274c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
274d0 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   k<nMaxCells );.
274e0 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f          if( aFro
274f0 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70  m[k]==0xFF || ap
27500 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e  Copy[aFrom[k]]->
27510 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
27520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
27530 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
27540 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20  (pNew, k-j);.   
27550 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
27580 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
275a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
275b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20  }.#endif..    j 
275c0 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
275d0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
275e0 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
275f0 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
27600 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27610 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
27620 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
27630 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
27640 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
27650 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
27660 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
27670 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
27680 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
27690 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
276a0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
276b0 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
276c0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
276d0 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
276e0 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
276f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
27700 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
27710 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
27720 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
27730 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
27740 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  4);.        pTem
27750 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
27760 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
27770 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
27780 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
27790 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
277a0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
277b0 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
277c0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
277d0 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
277e0 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
277f0 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
27800 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
27810 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
27820 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
27830 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
27840 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
27850 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27860 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
27870 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
27880 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
27890 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
278a0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
278b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
278c0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
278d0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
278e0 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
278f0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53 70      pCell = &aSp
27900 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
27910 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28       fillInCell(
27920 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20  pParent, pCell, 
27930 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
27940 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
27950 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
27960 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
27970 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
27980 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
27990 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
279a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
279b0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
279c0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
279d0 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
279e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
279f0 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
27a00 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
27a10 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
27a20 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   );.        /* O
27a30 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
27a40 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
27a50 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
27a60 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
27a70 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
27a80 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
27a90 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
27aa0 74 27 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  t's reported siz
27ab0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
27ac0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
27ad0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
27ae0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
27af0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
27b00 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
27b10 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
27b20 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
27b30 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
27b40 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
27b50 65 6c 6c 29 2e 20 42 75 74 20 69 74 27 73 20 69  ell). But it's i
27b60 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
27b70 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
27b80 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
27b90 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
27ba0 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
27bb0 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
27bc0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
27bd0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
27be0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
27bf0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
27c00 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
27c10 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
27c20 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
27c30 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
27c40 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
27c50 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
27c60 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
27c70 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
27c80 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
27c90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27ca0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
27cb0 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
27cc0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
27cd0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
27ce0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
27cf0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
27d00 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
27d10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27d20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
27d30 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
27d40 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
27d50 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
27d60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27d70 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
27d80 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75  leanup;.      pu
27d90 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
27da0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
27db0 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
27dc0 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
27dd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27de0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
27df0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
27e00 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
27e10 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
27e20 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
27e30 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
27e40 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
27e50 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
27e60 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
27e70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
27e80 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
27e90 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
27ea0 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
27eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27ec0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27ed0 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
27ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
27ef0 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
27f00 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
27f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27f30 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
27f40 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
27f50 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
27f60 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  f.      j++;.   
27f70 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
27f80 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
27f90 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
27fa0 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
27fb0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
27fc0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
27fd0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
27fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==0 ){.    memcp
27ff0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
28000 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43  ->aData[8], &apC
28010 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
28020 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20  ta[8], 4);.  }. 
28030 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
28040 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
28050 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
28060 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
28070 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
28080 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
28090 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
280a0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
280b0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
280c0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
280d0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
280e0 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
280f0 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
28100 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
28110 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
28120 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
28130 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
28140 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
28150 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
28160 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
28170 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
28180 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
28190 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
281a0 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
281b0 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
281c0 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
281d0 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
281e0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
281f0 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
28200 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
28210 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69  apNew[i]);.    i
28220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28230 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28240 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
28250 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
28260 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b  dPages(pParent);
28270 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
28280 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
28290 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
282a0 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
282b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
282c0 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
282d0 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
282e0 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
282f0 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
28300 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
28310 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
28320 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
28330 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
28340 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
28350 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
28360 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
28370 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
28380 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72  t->isInit );.  r
28390 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72  c = balance(pPar
283a0 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  ent, 0);.  .  /*
283b0 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
283c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
283d0 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
283e0 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 5f  anup:.  sqlite3_
283f0 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  free(apCell);.  
28400 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
28410 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
28420 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
28430 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
28440 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
28450 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
28460 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pNew[i]);.  }.  
28470 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
28480 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ent);.  TRACE(("
28490 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
284a0 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25  d with %d: old=%
284b0 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
284c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
284d0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c  pPage->pgno, nOl
284e0 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
284f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28500 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28510 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
28520 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
28530 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
28540 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
28550 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
28560 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
28570 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
28580 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
28590 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
285a0 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
285b0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
285c0 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65  hallower(MemPage
285d0 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
285e0 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
285f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28600 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20  only child page 
28610 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67  of pPage */.  Pg
28620 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
28630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28640 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43  ge number for pC
28650 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  hild */.  int rc
28660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28680 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
28690 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74  ocedures */.  Bt
286a0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
286c0 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20   The main BTree 
286d0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
286e0 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  nt mxCellPerPage
286f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
28700 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
28710 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20   cells per page 
28720 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
28730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28740 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66    /* All cells f
28750 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20  rom pages being 
28760 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
28770 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  t *szCell;      
28780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
28790 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
287a0 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65  cells */..  asse
287b0 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
287c0 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
287d0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
287e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
287f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28800 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
28810 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d  utex) );.  pBt =
28820 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
28830 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
28840 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
28850 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f  pCell = sqlite3_
28860 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65  malloc( mxCellPe
28870 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
28880 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  *)+sizeof(int)) 
28890 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
288a0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
288b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
288c0 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
288d0 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
288e0 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
288f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
28900 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
28910 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
28920 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
28930 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
28940 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
28950 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
28960 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
28970 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
28980 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
28990 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
289a0 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
289b0 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
289c0 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
289d0 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
289e0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
289f0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
28a00 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
28a10 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
28a20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
28a30 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
28a40 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
28a50 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
28a60 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
28a70 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
28a80 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
28a90 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
28aa0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
28ab0 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
28ac0 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
28ad0 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
28ae0 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
28af0 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
28b00 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
28b10 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
28b20 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
28b30 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
28b40 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
28b50 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
28b60 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
28b70 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
28b80 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
28b90 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
28ba0 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
28bb0 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
28bc0 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
28bd0 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
28be0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
28bf0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
28c00 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
28c10 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
28c20 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
28c30 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
28c40 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
28c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
28c60 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33  noChild<=sqlite3
28c70 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
28c80 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
28c90 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
28ca0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
28cb0 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
28cc0 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
28cd0 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
28ce0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
28cf0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
28d00 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
28d10 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
28d20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
28d30 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
28d40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
28d50 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
28d60 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
28d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28d80 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
28d90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
28da0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
28db0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
28dc0 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
28dd0 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
28de0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
28df0 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
28e00 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
28e10 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
28e20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
28e30 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
28e40 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
28e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
28e60 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
28e70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
28e80 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
28e90 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
28ea0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
28eb0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
28ec0 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
28ed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28ee0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
28ef0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
28f00 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
28f10 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
28f20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
28f30 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
28f40 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
28f50 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
28f60 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
28f70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
28f80 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
28f90 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
28fa0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
28fb0 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
28fc0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
28fd0 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
28fe0 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
28ff0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
29000 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
29010 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
29020 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
29030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29040 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
29050 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
29060 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
29070 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
29080 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
29090 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
290a0 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
290b0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
290c0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
290d0 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
290e0 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
290f0 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
29100 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
29110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
29120 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
29130 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
29140 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
29150 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
29160 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
29170 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
29180 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
29190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
291a0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
291b0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
291c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
291d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
291e0 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
291f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
29200 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
29210 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
29220 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
29230 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
29240 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
29250 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
29260 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
29270 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20  dPages(pPage);. 
29280 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29290 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
292a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
292b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
292c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
292d0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
292e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
292f0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
29300 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20  >nCell; i++){ . 
29310 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29320 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c  apPutOvfl(pPage,
29330 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
29340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29350 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
29360 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
29370 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ance;.        }.
29380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
29390 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65  ndif.    release
293a0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
293b0 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
293c0 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33  lance:.  sqlite3
293d0 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
293e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
293f0 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
29400 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
29410 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
29420 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
29430 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
29440 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
29450 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
29460 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
29470 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
29480 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
29490 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
294a0 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
294b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
294c0 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
294d0 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
294e0 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
294f0 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
29500 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
29510 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
29520 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
29530 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
29540 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
29550 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
29560 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
29570 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
29580 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
29590 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
295a0 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
295b0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
295c0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
295d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
295e0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
295f0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
29600 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
29610 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
29620 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
29630 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
29640 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
29650 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
29660 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
29670 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
29680 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
29690 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
296a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
296b0 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
296c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
296d0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
296e0 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
296f0 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
29700 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
29710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
29720 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
29730 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
29740 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
29750 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
29760 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
29770 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
29780 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
29790 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
297a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
297b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
297c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
297d0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
297e0 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
297f0 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
29800 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
29810 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29820 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
29830 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29840 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
29850 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
29860 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
29870 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
29880 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
29890 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
298a0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72  >hdrOffset;.  br
298b0 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
298c0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
298d0 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
298e0 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
298f0 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
29900 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
29910 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
29920 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
29930 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64  (&cdata[brk], &d
29940 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
29950 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73  Size-brk);.  ass
29960 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49  ert( pChild->isI
29970 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nit==0 );.  rc =
29980 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
29990 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
299a0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
299b0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
299c0 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  per_out;.  memcp
299d0 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
299e0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70   pPage->aOvfl, p
299f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
29a00 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
29a10 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
29a20 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
29a30 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29a40 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
29a50 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
29a60 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
29a70 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
29a80 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
29a90 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
29aa0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67  .  zeroPage(pPag
29ab0 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
29ac0 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
29ad0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
29ae0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
29af0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
29b00 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52  pgnoChild);.  TR
29b10 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
29b20 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
29b30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
29b40 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
29b50 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  o));.#ifndef SQL
29b60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29b70 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
29b80 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
29b90 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d   int i;.    rc =
29ba0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
29bb0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
29bc0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
29bd0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  e->pgno);.    if
29be0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
29bf0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
29c00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
29c10 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
29c20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
29c30 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69  rmapPutOvfl(pChi
29c40 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ld, i);.      if
29c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29c60 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29c70 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29c80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
29c90 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
29ca0 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a  nroot(pChild);..
29cb0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
29cc0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
29cd0 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  (pChild);.  retu
29ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29cf0 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61  Decide if the pa
29d00 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74  ge pPage needs t
29d10 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20  o be balanced.  
29d20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a  If balancing is.
29d30 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c  ** required, cal
29d40 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  l the appropriat
29d50 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  e balancing rout
29d60 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
29d70 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
29d80 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
29d90 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63  nsert){.  int rc
29da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29db0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29dc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
29dd0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
29de0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
29df0 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arent==0 ){.    
29e00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29e10 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
29e20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
29e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29e40 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29e50 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
29e60 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
29e70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
29e80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29e90 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
29ea0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
29eb0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
29ec0 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a  allower(pPage);.
29ed0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
29ee0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
29ef0 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
29f00 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26        (!insert &
29f10 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
29f20 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
29f30 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
29f40 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
29f50 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b  _nonroot(pPage);
29f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29f70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29f80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
29f90 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
29fa0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
29fb0 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
29fc0 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
29fd0 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
29fe0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
29ff0 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2a000 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2a010 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2a020 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a030 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2a040 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2a050 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2a060 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2a070 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2a080 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2a090 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2a0a0 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2a0b0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2a0c0 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2a0d0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2a0e0 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e  *.** In addition
2a0f0 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   to checking for
2a100 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65   read-locks (whe
2a110 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a  re a read-lock .
2a120 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f  ** means a curso
2a130 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  r opened with wr
2a140 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f  Flag==0) this ro
2a150 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73  utine also moves
2a160 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20 63 75  .** all write cu
2a170 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68  rsors so that th
2a180 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
2a190 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  to the .** first
2a1a0 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f   Cell on the roo
2a1b0 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  t page.  This is
2a1c0 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
2a1d0 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a  se an insert .**
2a1e0 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74   or delete might
2a1f0 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62   change the numb
2a200 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
2a210 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a   page or delete.
2a220 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65  ** a page entire
2a230 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  ly and we do not
2a240 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61   want to leave a
2a250 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70  ny cursors .** p
2a260 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65  ointing to non-e
2a270 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72  xistant pages or
2a280 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
2a290 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2a2a0 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72  ocks(Btree *pBtr
2a2b0 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ee, Pgno pgnoRoo
2a2c0 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
2a2d0 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73  clude){.  BtCurs
2a2e0 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
2a2f0 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
2a300 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
2a310 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53  *db = pBtree->pS
2a320 71 6c 69 74 65 3b 0a 20 20 61 73 73 65 72 74 28  qlite;.  assert(
2a330 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2a340 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
2a350 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2a360 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2a370 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2a380 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2a390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2a3a0 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2a3b0 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2a3c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2a3d0 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2a3e0 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ot ) continue;. 
2a3f0 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2a400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2a410 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2a420 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  p->pBtree->pSqli
2a430 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  te;.      if( db
2a440 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20  Other==0 ||.    
2a450 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64       (dbOther!=d
2a460 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66  b && (dbOther->f
2a470 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2a480 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d  adUncommitted)==
2a490 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
2a4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2a4b0 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
2a4c0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61  }else if( p->pPa
2a4d0 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e  ge->pgno!=p->pgn
2a4e0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d  oRoot ){.      m
2a4f0 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20  oveToRoot(p);.  
2a500 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a520 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2a530 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2a540 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2a550 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2a560 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2a570 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2a580 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2a590 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2a5a0 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2a5b0 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2a5c0 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
2a5d0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
2a5e0 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
2a5f0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2a600 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2a610 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2a620 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
2a630 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
2a640 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
2a650 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
2a660 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
2a670 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
2a680 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
2a690 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
2a6a0 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
2a6b0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2a6c0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
2a6d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2a6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a6f0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
2a700 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
2a710 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
2a720 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2a730 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2a740 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
2a750 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2a760 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2a770 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
2a780 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
2a790 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2a7a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a7d0 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
2a7e0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
2a7f0 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
2a800 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20  dBias           
2a810 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a820 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
2a830 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  an append */.){.
2a840 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2a850 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77  loc;.  int szNew
2a860 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2a870 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
2a880 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
2a890 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2a8a0 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
2a8b0 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
2a8c0 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
2a8d0 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
2a8e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2a8f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2a900 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r) );.  if( pBt-
2a910 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2a920 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2a930 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2a940 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2a950 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
2a960 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63 20  nsert */.    rc 
2a970 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2a980 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2a990 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2a9a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2a9b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2a9c0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2a9d0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2a9e0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2a9f0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2aa00 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20    /* Cursor not 
2aa10 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
2aa20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2aa30 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2aa40 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2aa50 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2aa60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2aa70 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2aa80 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2aa90 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2aaa0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2aab0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2aac0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2aad0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2aae0 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2aaf0 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73  e */.  clearCurs
2ab00 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ab10 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2ab20 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2ab30 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2ab40 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2ab50 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2ab60 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2ab70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2ab80 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2ab90 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
2aba0 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2abb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2abc0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2abd0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2abe0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2abf0 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
2ac00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ac10 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
2ac20 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52  leafData );.  TR
2ac30 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2ac40 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2ac50 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2ac60 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2ac70 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2ac80 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2ac90 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2aca0 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2acb0 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2acc0 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2acd0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2ace0 49 6e 69 74 20 29 3b 0a 20 20 6e 65 77 43 65 6c  Init );.  newCel
2acf0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
2ad00 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  oc( MX_CELL_SIZE
2ad10 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e  (pBt) );.  if( n
2ad20 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2ad30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2ad40 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2ad50 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2ad60 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2ad70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
2ad80 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
2ad90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2ada0 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
2adb0 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
2adc0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
2add0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
2ade0 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
2adf0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2ae00 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43   if( loc==0 && C
2ae10 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2ae20 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2ae30 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   int szOld;.    
2ae40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
2ae50 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
2ae60 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2ae70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2ae80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2ae90 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2aea0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2aeb0 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
2aec0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
2aed0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2aee0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2aef0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2af00 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2af10 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
2af20 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
2af30 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
2af40 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2af50 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
2af60 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2af70 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
2af80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2af90 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2afa0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2afb0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a  e, pCur->idx, sz
2afc0 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Old);.  }else if
2afd0 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
2afe0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
2aff0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b000 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72  leaf );.    pCur
2b010 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75  ->idx++;.    pCu
2b020 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2b030 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2b040 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2b050 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  eaf );.  }.  rc 
2b060 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2b070 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e  ge, pCur->idx, n
2b080 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30  ewCell, szNew, 0
2b090 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
2b0a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2b0b0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72   end_insert;.  r
2b0c0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2b0d0 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69  e, 1);.  /* sqli
2b0e0 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70  te3BtreePageDump
2b0f0 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72  (pCur->pBt, pCur
2b100 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20  ->pgnoRoot, 1); 
2b110 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73  */.  /* fflush(s
2b120 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28  tdout); */.  if(
2b130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b140 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
2b150 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f  (pCur);.  }.end_
2b160 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74 65  insert:.  sqlite
2b170 33 5f 66 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b  3_free(newCell);
2b180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b190 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2b1a0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2b1b0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2b1c0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2b1d0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2b1e0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2b1f0 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2b200 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b210 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2b220 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2b230 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2b240 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2b250 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2b260 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2b270 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2b280 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2b290 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2b2a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2b2b0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2b2c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2b2d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2b2e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2b2f0 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  it );.  if( pBt-
2b300 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2b310 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2b320 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2b330 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2b340 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65  efore doing a de
2b350 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  lete */.    rc =
2b360 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2b370 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2b380 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2b390 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b3a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2b3b0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2b3c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20    if( pCur->idx 
2b3d0 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  >= pPage->nCell 
2b3e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b3f0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
2b400 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
2b410 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
2b420 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
2b430 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2b440 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2b450 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2b460 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74  * Did not open t
2b470 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77  his cursor for w
2b480 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2b490 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2b4a0 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2b4b0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2b4c0 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65   pCur) ){.    re
2b4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2b4e0 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2b4f0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2b500 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2b510 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2b520 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2b530 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2b540 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2b550 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2b560 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2b570 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2b580 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2b590 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2b5a0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2b5b0 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2b5c0 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2b5d0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2b5e0 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2b5f0 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2b600 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2b610 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2b620 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2b630 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43  (rc = restoreOrC
2b640 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2b650 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  on(pCur))!=0 ||.
2b660 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c      (rc = saveAl
2b670 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2b680 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2b690 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2b6a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b6b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2b6c0 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a  bPage))!=0.  ){.
2b6d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b6e0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2b6f0 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2b700 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65  it's page and le
2b710 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2b720 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2b730 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2b740 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2b750 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2b760 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2b770 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2b780 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2b790 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2b7a0 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
2b7b0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2b7c0 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2b7d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b7e0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
2b7f0 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2b800 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
2b810 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2b820 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
2b830 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2b840 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  rc;.  }..  if( !
2b850 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b860 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2b870 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2b880 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2b890 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2b8a0 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2b8b0 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2b8c0 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2b8d0 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2b8e0 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2b8f0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2b900 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2b910 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2b920 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2b930 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2b940 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2b950 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2b960 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2b970 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2b980 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2b990 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2b9a0 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2b9b0 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2b9c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2b9d0 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e  ext;.    int szN
2b9e0 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ext;  /* The com
2b9f0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73  piler warning is
2ba00 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69   wrong: szNext i
2ba10 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20  s always .      
2ba20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
2ba30 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
2ba40 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e   use.  Adding an
2ba50 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2ba60 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2ba70 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c         ** to sil
2ba80 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  ence the compile
2ba90 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65  r slows down the
2baa0 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   code. */.    in
2bab0 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75  t notUsed;.    u
2bac0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
2bad0 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  mpCell = 0;.    
2bae0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e  assert( !pPage->
2baf0 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20  leafData );.    
2bb00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
2bb10 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2bb20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2bb30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2bb40 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2bb50 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2bb60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2bb80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bb90 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2bba0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2bbb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bbc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 52  E_OK ){.      TR
2bbd0 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2bbe0 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e  ble=%d delete in
2bbf0 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72  ternal from %d r
2bc00 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66  eplace from leaf
2bc10 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
2bc20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2bc30 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65   pPage->pgno, le
2bc40 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e  afCur.pPage->pgn
2bc50 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43  o));.      dropC
2bc60 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2bc70 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2bc80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2bc90 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
2bca0 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72  findCell(leafCur
2bcb0 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2bcc0 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  idx);.      szNe
2bcd0 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  xt = cellSizePtr
2bce0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2bcf0 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73  pNext);.      as
2bd00 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
2bd10 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b  ZE(pBt)>=szNext+
2bd20 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  4 );.      tempC
2bd30 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
2bd40 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  lloc( MX_CELL_SI
2bd50 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  ZE(pBt) );.     
2bd60 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30   if( tempCell==0
2bd70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2bd80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2bd90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2bda0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bdb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2bdc0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2bdd0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e  e, pCur->idx, pN
2bde0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
2bdf0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
2be00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2be10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2be20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2be30 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2be40 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c  age, pCur->idx),
2be50 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
2be60 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2be70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pPage, 0);.    }
2be80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2be90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bea0 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72  dropCell(leafCur
2beb0 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2bec0 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  idx, szNext);.  
2bed0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2bee0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2bef0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
2bf00 6c 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70 43  lite3_free(tempC
2bf10 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ell);.    sqlite
2bf20 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
2bf30 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
2bf40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2bf50 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2bf60 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2bf70 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2bf80 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
2bf90 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
2bfa0 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
2bfb0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2bfc0 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2bfd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2bfe0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2bff0 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2c000 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2c010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2c020 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c030 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c040 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2c050 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
2c060 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
2c070 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
2c080 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2c090 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2c0a0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
2c0b0 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
2c0c0 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
2c0d0 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
2c0e0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
2c0f0 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
2c100 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
2c110 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
2c120 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
2c130 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
2c140 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
2c150 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
2c160 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
2c170 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
2c180 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
2c190 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
2c1a0 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
2c1b0 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
2c1c0 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
2c1d0 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
2c1e0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2c1f0 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2c200 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2c210 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2c220 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2c230 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
2c240 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
2c250 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
2c260 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2c270 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c280 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c290 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2c2a0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2c2b0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2c2c0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2c2d0 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a  nsaction first *
2c2e0 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
2c2f0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2c300 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2c310 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
2c320 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2c330 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2c340 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
2c350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2c360 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
2c370 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2c380 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2c390 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2c3a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2c3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c3c0 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
2c3d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2c3e0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
2c3f0 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
2c400 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
2c410 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2c420 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
2c430 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
2c440 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
2c450 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
2c460 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67  .    /* Creating
2c470 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79   a new table may
2c480 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72   probably requir
2c490 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73  e moving an exis
2c4a0 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20  ting database.  
2c4b0 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f    ** to make roo
2c4c0 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  m for the new ta
2c4d0 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20  bles root page. 
2c4e0 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67  In case this pag
2c4f0 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f  e turns.    ** o
2c500 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72  ut to be an over
2c510 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74  flow page, delet
2c520 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  e all overflow p
2c530 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20  age-map caches. 
2c540 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70     ** held by op
2c550 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20  en cursors..    
2c560 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  */.    invalidat
2c570 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
2c580 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  e(pBt);..    /* 
2c590 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
2c5a0 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
2c5b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
2c5c0 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
2c5d0 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
2c5e0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2c5f0 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
2c600 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
2c610 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2c620 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2c630 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
2c640 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
2c650 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
2c660 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2c670 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2c680 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74  (p, 4, &pgnoRoot
2c690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2c6a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c6b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2c6c0 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b   }.    pgnoRoot+
2c6d0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
2c6e0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
2c6f0 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
2c700 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
2c710 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
2c720 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2c730 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
2c740 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f  .    if( pgnoRoo
2c750 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
2c760 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
2c770 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
2c780 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
2c790 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2c7a0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
2c7b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2c7c0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
2c7d0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
2c7e0 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
2c7f0 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
2c800 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
2c810 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
2c820 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
2c830 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2c840 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
2c850 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
2c860 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
2c870 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
2c880 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
2c890 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2c8a0 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
2c8b0 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
2c8c0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
2c8d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2c8f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2c900 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
2c910 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
2c920 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
2c930 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
2c940 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
2c950 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2c960 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2c970 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
2c980 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
2c990 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
2c9a0 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
2c9b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
2c9c0 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
2c9d0 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
2c9e0 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
2c9f0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
2ca00 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
2ca10 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
2ca20 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
2ca30 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
2ca40 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
2ca50 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
2ca60 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2ca70 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
2ca80 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
2ca90 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
2caa0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
2cab0 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
2cac0 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
2cad0 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
2cae0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2caf0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2cb00 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2cb10 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2cb20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cb30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2cb40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2cb50 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
2cb60 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
2cb70 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
2cb80 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
2cb90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cba0 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
2cbb0 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
2cbc0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2cbd0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2cbe0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2cbf0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2cc00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2cc10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2cc20 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
2cc30 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
2cc40 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
2cc50 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
2cc60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2cc70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
2cc80 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2cc90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ccb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2ccc0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2ccd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2cce0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2ccf0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
2cd00 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
2cd10 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a  age, pgnoMove);.
2cd20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2cd30 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
2cd40 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
2cd50 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
2cd60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
2cd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cd80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2cd90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2cda0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2cdb0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
2cdc0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
2cdd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2cde0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cdf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ce00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2ce10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ce20 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
2ce30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2ce40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ce50 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2ce60 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2ce70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ce80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ce90 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
2cea0 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
2ceb0 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
2cec0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2ced0 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
2cee0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
2cef0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
2cf00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
2cf10 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
2cf20 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
2cf30 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
2cf40 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2cf50 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2cf60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2cf70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
2cf80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2cf90 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
2cfa0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2cfb0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2cfc0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2cfd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2cfe0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
2cff0 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
2d000 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2d010 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2d020 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
2d030 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d040 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2d050 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d060 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d070 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2d080 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
2d090 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
2d0a0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
2d0b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
2d0c0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2d0d0 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
2d0e0 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
2d0f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d100 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d110 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2d120 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2d130 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2d140 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
2d150 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
2d160 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
2d170 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
2d180 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
2d190 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2d1a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2d1b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
2d1c0 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
2d1d0 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
2d1e0 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
2d1f0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
2d200 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
2d210 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
2d220 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
2d230 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2d240 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2d250 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
2d260 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2d270 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
2d280 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2d290 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2d2a0 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
2d2b0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2d2c0 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2d2d0 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
2d2e0 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
2d2f0 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
2d300 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
2d310 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
2d320 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2d330 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
2d340 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2d350 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2d360 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
2d370 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d380 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2d390 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c  ;.  if( pgno>sql
2d3a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
2d3b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
2d3c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d3d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d3e0 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
2d3f0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2d400 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c  t, pgno, &pPage,
2d410 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28   pParent);.  if(
2d420 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2d430 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2d440 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2d450 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2d460 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
2d470 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2d480 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2d490 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d4a0 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2d4b0 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2d4c0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
2d4d0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2d4e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2d4f0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2d500 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  asepage_out;.   
2d510 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61   }.    rc = clea
2d520 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2d530 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2d540 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2d550 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2d560 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2d570 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
2d580 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2d590 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2d5a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38  (&pPage->aData[8
2d5b0 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ]), pPage->pPare
2d5c0 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  nt, 1);.    if( 
2d5d0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2d5e0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2d5f0 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
2d600 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
2d610 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2d620 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
2d630 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2d640 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d650 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
2d660 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2d670 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
2d680 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
2d690 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
2d6a0 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
2d6b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2d6c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d6d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2d6e0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2d6f0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
2d700 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
2d710 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
2d720 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
2d730 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
2d740 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
2d750 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
2d760 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
2d770 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2d780 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
2d790 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
2d7a0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2d7b0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2d7c0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2d7d0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2d7e0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
2d7f0 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
2d800 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
2d810 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
2d820 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
2d830 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
2d840 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2d850 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2d860 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74  t iTable){.  int
2d870 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
2d880 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2d890 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2d8a0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  er(p);.  if( p->
2d8b0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2d8c0 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  RITE ){.    rc =
2d8d0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2d8e0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2d8f0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2d900 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63  .  }else if( (rc
2d910 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b   = checkReadLock
2d920 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  s(p, iTable, 0))
2d930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d940 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
2d950 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69   do */.  }else i
2d960 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
2d970 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2d980 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20  rs(pBt, iTable, 
2d990 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  0)) ){.    /* no
2d9a0 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
2d9b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2d9c0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2d9d0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2d9e0 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  able, 0, 0);.  }
2d9f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2da00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2da10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2da20 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  rase all informa
2da30 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20  tion in a table 
2da40 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74  and add the root
2da50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
2da60 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74  .** the freelist
2da70 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72  .  Except, the r
2da80 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63  oot of the princ
2da90 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20  iple table (the 
2daa0 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31  one on.** page 1
2dab0 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64  ) is never added
2dac0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2dad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2dae0 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
2daf0 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
2db00 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
2db10 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f  ny open.** curso
2db20 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2db30 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
2db40 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
2db50 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20  and the page at 
2db60 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68  iTable is not th
2db70 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70  e last.** root p
2db80 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2db90 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
2dba0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2dbb0 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  e .** in the dat
2dbc0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f  abase file is mo
2dbd0 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f  ved into the slo
2dbe0 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
2dbf0 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65  ied by.** iTable
2dc00 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73   and that last s
2dc10 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
2dc20 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73  upied by the las
2dc30 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  t root page.** i
2dc40 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
2dc50 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20  reelist instead 
2dc60 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74  of iTable.  In t
2dc70 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20  his say, all.** 
2dc80 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b  root pages are k
2dc90 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ept at the begin
2dca0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
2dcb0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
2dcc0 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79  .** is necessary
2dcd0 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20   for AUTOVACUUM 
2dce0 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20  to work right.  
2dcf0 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
2dd00 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  to the .** page 
2dd10 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64  number that used
2dd20 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
2dd30 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2dd40 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20   file before.** 
2dd50 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f  the move.  If no
2dd60 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64   page gets moved
2dd70 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65  , *piMoved is se
2dd80 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c  t to 0..** The l
2dd90 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ast root page is
2dda0 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74   recorded in met
2ddb0 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c  a[3] and the val
2ddc0 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d  ue of.** meta[3]
2ddd0 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74   is updated by t
2dde0 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a  his procedure..*
2ddf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2de00 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
2de10 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2de20 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
2de30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2de40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2de50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2de60 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
2de70 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2de80 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2de90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
2dea0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2deb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2dec0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2ded0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2dee0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2def0 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2df00 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2df10 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2df20 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2df30 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2df40 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2df50 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2df60 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2df70 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2df80 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2df90 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2dfa0 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2dfb0 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2dfc0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2dfd0 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2dfe0 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2dff0 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2e000 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2e010 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2e020 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2e030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2e040 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2e050 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2e060 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
2e070 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
2e080 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2e090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
2e0a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
2e0b0 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
2e0c0 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ble);.  if( rc )
2e0d0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2e0e0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2e0f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2e100 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
2e110 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
2e120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2e130 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e140 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2e150 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
2e160 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2e170 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
2e180 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2e190 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
2e1a0 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2e1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2e1c0 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2e1d0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2e1e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e1f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e200 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2e210 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
2e220 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2e230 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
2e240 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
2e250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2e260 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2e270 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
2e280 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
2e290 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2e2a0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
2e2b0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2e2c0 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
2e2d0 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2e2e0 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
2e2f0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2e300 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2e310 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2e320 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2e330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e350 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2e380 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
2e390 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
2e3a0 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
2e3b0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2e3c0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
2e3d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2e3e0 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
2e3f0 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
2e400 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
2e410 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2e420 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
2e430 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
2e440 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2e450 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
2e460 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e470 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2e480 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2e490 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2e4a0 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2e4b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2e4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e4d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2e4e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2e4f0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2e500 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
2e510 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
2e520 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a  GE, 0, iTable);.
2e530 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e540 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2e550 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e570 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e590 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2e5a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
2e5b0 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2e5c0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2e5d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2e5f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2e600 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2e610 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  freePage(pMove);
2e620 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2e630 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2e640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e680 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52   *piMoved = maxR
2e690 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ootPgno;.      }
2e6a0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
2e6b0 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74  he new 'max-root
2e6c0 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20  -page' value in 
2e6d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
2e6e0 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20  der. This.      
2e6f0 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61  ** is the old va
2e700 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65  lue less one, le
2e710 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74  ss one more if t
2e720 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20  hat happens to. 
2e730 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f       ** be a roo
2e740 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c  t-page number, l
2e750 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66  ess one again if
2e760 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20   that is the.   
2e770 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
2e780 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a  TE_PAGE..      *
2e790 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50  /.      maxRootP
2e7a0 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  gno--;.      if(
2e7b0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45   maxRootPgno==PE
2e7c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2e7d0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
2e7e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2e7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e800 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54   maxRootPgno==PT
2e810 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
2e820 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b   maxRootPgno) ){
2e830 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
2e840 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
2e850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
2e860 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49  xRootPgno!=PENDI
2e870 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2e880 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) );..      rc =
2e890 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2e8a0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61  ateMeta(p, 4, ma
2e8b0 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2e8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e8d0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2e8e0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2e8f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2e900 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
2e910 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c  e{.    /* If sql
2e920 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2e930 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e  le was called on
2e940 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20   page 1. */.    
2e950 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2e960 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2e970 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  EAF );.    relea
2e980 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2e990 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
2e9a0 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   .}.int sqlite3B
2e9b0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
2e9c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2e9d0 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64  le, int *piMoved
2e9e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2e9f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2ea00 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
2ea10 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54  eDropTable(p, iT
2ea20 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a  able, piMoved);.
2ea30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2ea40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2ea50 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2ea60 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
2ea70 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
2ea80 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2ea90 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2eaa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2eab0 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
2eac0 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
2ead0 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
2eae0 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
2eaf0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
2eb00 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
2eb10 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
2eb20 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
2eb30 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
2eb40 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
2eb50 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
2eb60 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
2eb70 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
2eb80 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
2eb90 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
2eba0 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
2ebb0 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
2ebc0 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
2ebd0 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
2ebe0 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
2ebf0 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
2ec00 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
2ec10 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
2ec20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
2ec30 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
2ec40 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
2ec50 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20  Meta){.  DbPage 
2ec60 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20  *pDbPage;.  int 
2ec70 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2ec80 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68  har *pP1;.  BtSh
2ec90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2eca0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
2ecb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  reeEnter(p);..  
2ecc0 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
2ecd0 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
2ece0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
2ecf0 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
2ed00 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
2ed10 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2ed20 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
2ed30 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
2ed40 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
2ed50 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
2ed60 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2ed70 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2ed80 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
2ed90 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
2eda0 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
2edb0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
2edc0 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2edd0 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
2ede0 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
2edf0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
2ee00 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
2ee10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2ee20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2ee30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2ee40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2ee50 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2ee60 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
2ee70 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  5 );.  rc = sqli
2ee80 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2ee90 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
2eea0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2eeb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
2eec0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
2eed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2eee0 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65    pP1 = (unsigne
2eef0 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
2ef00 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
2ef10 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20  Page);.  *pMeta 
2ef20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
2ef30 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20  36 + idx*4]);.  
2ef40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2ef50 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  f(pDbPage);..  /
2ef60 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65  * If autovacuume
2ef70 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  d is disabled in
2ef80 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20   this build but 
2ef90 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
2efa0 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e   .  ** access an
2efb0 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61   autovacuumed da
2efc0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b  tabase, then mak
2efd0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  e the database r
2efe0 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23  eadonly. .  */.#
2eff0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2f000 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
2f010 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d  f( idx==4 && *pM
2f020 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61  eta>0 ) pBt->rea
2f030 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69  dOnly = 1;.#endi
2f040 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  f..  /* Grab the
2f050 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
2f060 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ge 1. */.  rc = 
2f070 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20  lockTable(p, 1, 
2f080 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  READ_LOCK);.  sq
2f090 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2f0a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2f0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2f0c0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
2f0d0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
2f0e0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
2f0f0 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
2f100 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
2f110 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
2f120 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2f130 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
2f140 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
2f150 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
2f160 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2f170 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2f180 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
2f190 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2f1a0 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
2f1b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2f1c0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
2f1d0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2f1e0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
2f1f0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2f200 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2f210 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2f220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2f230 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
2f240 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31  e1!=0 );.    pP1
2f250 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
2f260 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
2f270 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f280 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
2f290 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2f2a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f2b0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2f2c0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
2f2d0 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 20 20 20  ], iMeta);.     
2f2e0 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20   if( idx==7 ){. 
2f2f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f300 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c  Bt->autoVacuum |
2f310 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20  | iMeta==0 );.  
2f320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d        assert( iM
2f330 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d  eta==0 || iMeta=
2f340 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42  =1 );.        pB
2f350 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
2f360 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20  iMeta;.      }. 
2f370 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2f380 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2f390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f3a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2f3b0 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74  e flag byte at t
2f3c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2f3d0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
2f3e0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63  e cursor.** is c
2f3f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2f400 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  g to..*/.int sql
2f410 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42  ite3BtreeFlags(B
2f420 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2f430 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2f440 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51  about CURSOR_REQ
2f450 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20  UIRESEEK state? 
2f460 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  Probably need to
2f470 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f   call.  ** resto
2f480 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2f490 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a  osition() here..
2f4a0 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a    */.  MemPage *
2f4b0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2f4c0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  age;.  assert( c
2f4d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2f4e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2f4f0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70  t( pPage->pBt==p
2f500 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65  Cur->pBt );.  re
2f510 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61  turn pPage ? pPa
2f520 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2f530 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b  >hdrOffset] : 0;
2f540 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2f550 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f  n the pager asso
2f560 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54  ciated with a BT
2f570 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ree.  This routi
2f580 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  ne is used for.*
2f590 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2f5a0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2f5b0 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42  .Pager *sqlite3B
2f5c0 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20  treePager(Btree 
2f5d0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
2f5e0 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a  >pBt->pPager;.}.
2f5f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f600 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2f610 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
2f620 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
2f630 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2f640 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
2f650 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
2f660 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
2f670 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
2f680 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
2f690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2f6a0 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
2f6b0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
2f6c0 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28  ar *zMsg2;.  if(
2f6d0 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
2f6e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
2f6f0 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
2f700 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
2f710 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2f720 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20  ormat);.  zMsg2 
2f730 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
2f740 66 28 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  f(0, zFormat, ap
2f750 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
2f760 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20  .  if( zMsg1==0 
2f770 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20  ) zMsg1 = "";.  
2f780 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  if( pCheck->zErr
2f790 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Msg ){.    char 
2f7a0 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e  *zOld = pCheck->
2f7b0 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68  zErrMsg;.    pCh
2f7c0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  eck->zErrMsg = 0
2f7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
2f7e0 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
2f7f0 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22  zErrMsg, zOld, "
2f800 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  \n", zMsg1, zMsg
2f810 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
2f820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f830 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Old);.  }else{. 
2f840 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2f850 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
2f860 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  rMsg, zMsg1, zMs
2f870 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
2f880 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2f890 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64  e(zMsg2);.}.#end
2f8a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2f8b0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2f8c0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
2f8d0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2f8e0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
2f8f0 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
2f900 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
2f910 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
2f920 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
2f930 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
2f940 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
2f950 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
2f960 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
2f970 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
2f980 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
2f990 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
2f9a0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2f9b0 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
2f9c0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2f9d0 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
2f9e0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2f9f0 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
2fa00 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2fa10 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
2fa20 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
2fa30 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
2fa40 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50   *pCheck, int iP
2fa50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
2fa60 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
2fa70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
2fa80 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
2fa90 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50  eck->nPage || iP
2faa0 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65  age<0 ){.    che
2fab0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2fac0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
2fad0 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
2fae0 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  er %d", iPage);.
2faf0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2fb00 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  }.  if( pCheck->
2fb10 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20  anRef[iPage]==1 
2fb20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2fb30 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2fb40 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66  ontext, "2nd ref
2fb50 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25  erence to page %
2fb60 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
2fb70 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2fb80 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d  return  (pCheck-
2fb90 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29  >anRef[iPage]++)
2fba0 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  >1;.}..#ifndef S
2fbb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2fbc0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ACUUM./*.** Chec
2fbd0 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  k that the entry
2fbe0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2fbf0 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68  map for page iCh
2fc00 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20  ild maps to .** 
2fc10 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f  page iParent, po
2fc20 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79  inter type ptrTy
2fc30 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65  pe. If not, appe
2fc40 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
2fc50 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b  age.** to pCheck
2fc60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fc70 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20   checkPtrmap(.  
2fc80 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
2fc90 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72  eck,   /* Integr
2fca0 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78  ity check contex
2fcb0 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  t */.  Pgno iChi
2fcc0 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld,           /*
2fcd0 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   Child page numb
2fce0 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  er */.  u8 eType
2fcf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2fd00 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
2fd10 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20  er map type */. 
2fd20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20   Pgno iParent,  
2fd30 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
2fd40 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
2fd50 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
2fd60 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  er */.  char *zC
2fd70 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f  ontext         /
2fd80 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69  * Context descri
2fd90 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20  ption (used for 
2fda0 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b  error msg) */.){
2fdb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
2fdc0 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50  ePtrmapType;.  P
2fdd0 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e  gno iPtrmapParen
2fde0 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61  t;..  rc = ptrma
2fdf0 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74  pGet(pCheck->pBt
2fe00 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d  , iChild, &ePtrm
2fe10 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70  apType, &iPtrmap
2fe20 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
2fe30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fe40 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2fe50 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
2fe60 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
2fe70 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
2fe80 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
2fe90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2fea0 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
2feb0 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
2fec0 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
2fed0 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
2fee0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2fef0 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
2ff00 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
2ff10 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
2ff20 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
2ff30 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
2ff40 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
2ff50 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
2ff60 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
2ff70 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
2ff80 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
2ff90 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
2ffa0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
2ffb0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
2ffc0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
2ffd0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
2ffe0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2fff0 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
30000 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
30010 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
30020 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
30030 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
30040 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
30050 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
30060 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
30070 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
30080 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
30090 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
300a0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
300b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
300c0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
300d0 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
300e0 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
300f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30100 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
30110 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
30120 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
30130 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
30140 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
30150 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
30160 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
30170 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
30180 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
30190 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
301a0 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
301b0 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
301c0 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66      DbPage *pOvf
301d0 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67  lPage;.    unsig
301e0 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44  ned char *pOvflD
301f0 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61  ata;.    if( iPa
30200 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
30210 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30220 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
30230 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
30240 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
30250 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
30260 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
30270 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
30280 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
30290 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
302a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
302b0 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
302c0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
302d0 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
302e0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
302f0 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67  Get(pCheck->pPag
30300 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  er, (Pgno)iPage,
30310 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a   &pOvflPage) ){.
30320 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
30330 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30340 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
30350 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
30360 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
30370 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
30380 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69  OvflData = (unsi
30390 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
303a0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
303b0 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20  pOvflPage);.    
303c0 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29  if( isFreeList )
303d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
303e0 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
303f0 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  ata[4]);.#ifndef
30400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30410 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
30420 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
30430 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
30440 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
30450 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
30460 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
30470 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
30480 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
30490 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
304a0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
304b0 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20  e/4-8 ){.       
304c0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
304d0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
304e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
304f0 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
30500 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
30510 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
30520 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
30530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
30550 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
30560 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
30570 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
30580 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66  ata[8+i*4]);.#if
30590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
305a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
305b0 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
305c0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
305d0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
305e0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
305f0 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
30600 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
30610 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
30620 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
30630 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  f.          chec
30640 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72  kRef(pCheck, iFr
30650 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74  eePage, zContext
30660 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30670 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20       N -= n;.   
30680 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
30690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
306a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c  UTOVACUUM.    el
306b0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
306c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75  this database su
306d0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
306e0 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20  um and iPage is 
306f0 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20  not the last.   
30700 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
30710 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  is overflow list
30720 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
30730 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
30740 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ry for.      ** 
30750 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
30760 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65  ge matches iPage
30770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30780 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
30790 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
307a0 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  N>0 ){.        i
307b0 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
307c0 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  lData);.        
307d0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
307e0 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
307f0 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
30800 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
30810 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
30820 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
30830 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
30840 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
30850 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65  rUnref(pOvflPage
30860 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
30870 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
30880 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
30890 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
308a0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
308b0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20  _CHECK./*.** Do 
308c0 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63  various sanity c
308d0 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c  hecks on a singl
308e0 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65  e page of a tree
308f0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
30900 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f   tree depth.  Ro
30910 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20  ot pages return 
30920 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72  0.  Parents of r
30930 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74  oot pages.** ret
30940 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f  urn 1, and so fo
30950 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73  rth..** .** Thes
30960 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e  e checks are don
30970 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e  e:.**.**      1.
30980 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
30990 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62   cells and freeb
309a0 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65  locks do not ove
309b0 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  rlap.**         
309c0 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20   but combine to 
309d0 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72  completely cover
309e0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e   the page..**  N
309f0 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  2.  Make sure
30a00 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69   cell keys are i
30a10 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20  n order..**  NO 
30a20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   3.  Make sure n
30a30 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  o key is less th
30a40 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
30a50 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  LowerBound..**  
30a60 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72  NO  4.  Make sur
30a70 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61  e no key is grea
30a80 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
30a90 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64  l to zUpperBound
30aa0 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68  ..**      5.  Ch
30ab0 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
30ac0 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  y of overflow pa
30ad0 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20  ges..**      6. 
30ae0 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c   Recursively cal
30af0 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20  l checkTreePage 
30b00 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e  on all children.
30b10 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72  .**      7.  Ver
30b20 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70  ify that the dep
30b30 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  th of all childr
30b40 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  en is the same..
30b50 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65  **      8.  Make
30b60 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20   sure this page 
30b70 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20  is at least 33% 
30b80 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20  full or else it 
30b90 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  is.**          t
30ba0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
30bb0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
30bc0 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  nt checkTreePage
30bd0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
30be0 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e  *pCheck,  /* Con
30bf0 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e  text for the san
30c00 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ity check */.  i
30c10 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
30c20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
30c30 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
30c40 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65  to check */.  Me
30c50 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
30c60 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
30c70 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ge */.  char *zP
30c80 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a  arentContext  /*
30c90 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20   Parent context 
30ca0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
30cb0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
30cc0 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20   rc, depth, d2, 
30cd0 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74  pgno, cnt;.  int
30ce0 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b   hdr, cellStart;
30cf0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
30d00 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68  u8 *data;.  BtSh
30d10 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
30d20 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63   usableSize;.  c
30d30 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30  har zContext[100
30d40 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a  ];.  char *hit;.
30d50 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
30d60 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
30d70 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  ext), zContext, 
30d80 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61  "Page %d: ", iPa
30d90 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ge);..  /* Check
30da0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65   that the page e
30db0 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74  xists.  */.  pBt
30dc0 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a   = pCheck->pBt;.
30dd0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
30de0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
30df0 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
30e00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
30e10 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
30e20 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74  , iPage, zParent
30e30 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72  Context) ) retur
30e40 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  n 0;.  if( (rc =
30e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
30e60 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
30e70 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
30e80 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
30e90 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30ea0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
30eb0 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
30ec0 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65 72  get the page. er
30ed0 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63  ror code=%d", rc
30ee0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
30ef0 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d  .  }.  if( (rc =
30f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
30f10 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
30f20 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
30f30 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30f40 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30f50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
30f60 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74        "sqlite3Bt
30f70 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65  reeInitPage() re
30f80 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
30f90 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
30fa0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30fb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
30fc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
30fd0 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
30fe0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
30ff0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
31000 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
31010 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
31020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
31030 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
31040 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
31050 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
31060 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
31070 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
31080 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
31090 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
310a0 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
310b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
310c0 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64  "On tree page %d
310d0 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61   cell %d: ", iPa
310e0 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c  ge, i);.    pCel
310f0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
31100 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge,i);.    sqlit
31110 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
31120 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
31130 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
31140 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20   = info.nData;. 
31150 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
31160 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e  ntKey ) sz += in
31170 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73  fo.nKey;.    ass
31180 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50  ert( sz==info.nP
31190 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66  ayload );.    if
311a0 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ( sz>info.nLocal
311b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
311c0 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f  age = (sz - info
311d0 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65  .nLocal + usable
311e0 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c  Size - 5)/(usabl
311f0 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
31200 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
31210 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
31220 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
31230 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
31240 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31250 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
31260 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
31270 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
31280 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
31290 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
312a0 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a  RFLOW1, iPage, z
312b0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
312c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
312d0 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c  heckList(pCheck,
312e0 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50   0, pgnoOvfl, nP
312f0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31300 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
31310 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65  eck sanity of le
31320 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ft child page.. 
31330 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
31340 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31350 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
31360 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e  yte(pCell);.#ifn
31370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31380 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
31390 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
313a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
313b0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
313c0 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
313d0 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a  _BTREE, iPage, z
313e0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
313f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  }.#endif.      d
31400 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67  2 = checkTreePag
31410 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50  e(pCheck,pgno,pP
31420 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  age,zContext);. 
31430 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
31440 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
31450 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31460 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31470 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
31480 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
31490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
314a0 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
314b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
314c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
314d0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
314e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
314f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
31500 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
31510 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31520 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
31530 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
31540 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
31550 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
31560 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
31570 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
31580 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31590 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
315a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
315b0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
315c0 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
315d0 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
315e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
315f0 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
31600 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
31610 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
31620 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
31630 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
31640 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
31650 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
31660 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
31670 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
31680 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
31690 68 69 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  hit = sqlite3Mal
316a0 6c 6f 63 5a 65 72 6f 28 20 75 73 61 62 6c 65 53  locZero( usableS
316b0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74  ize );.  if( hit
316c0 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68   ){.    memset(h
316d0 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28  it, 1, get2byte(
316e0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a  &data[hdr+5]));.
316f0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
31700 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
31710 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
31720 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
31730 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
31740 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
31750 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
31760 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
31770 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
31780 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69  t+i*2]);.      i
31790 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69  nt size = cellSi
317a0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
317b0 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69  ta[pc]);.      i
317c0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
317d0 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61  (pc+size-1)>=usa
317e0 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20  bleSize || pc<0 
317f0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31800 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31810 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
31820 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
31830 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
31840 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
31850 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
31860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
31870 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20  or(j=pc+size-1; 
31880 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b  j>=pc; j--) hit[
31890 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j]++;.      }.  
318a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d    }.    for(cnt=
318b0 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64  0, i=get2byte(&d
318c0 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30  ata[hdr+1]); i>0
318d0 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65   && i<usableSize
318e0 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a   && cnt<10000; .
318f0 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
31900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
31910 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
31920 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ta[i+2]);.      
31930 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
31940 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61   (i+size-1)>=usa
31950 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29  bleSize || i<0 )
31960 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
31970 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31980 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20   0,  .          
31990 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
319a0 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
319b0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
319c0 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
319d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
319e0 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a  or(j=i+size-1; j
319f0 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  >=i; j--) hit[j]
31a00 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
31a10 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
31a20 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  data[i]);.    }.
31a30 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b      for(i=cnt=0;
31a40 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69   i<usableSize; i
31a50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
31a60 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  it[i]==0 ){.    
31a70 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
31a80 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69   }else if( hit[i
31a90 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ]>1 ){.        c
31aa0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31ab0 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20  heck, 0,.       
31ac0 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65     "Multiple use
31ad0 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66  s for byte %d of
31ae0 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50   page %d", i, iP
31af0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
31b00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
31b10 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
31b20 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20  data[hdr+7] ){. 
31b30 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31b40 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
31b50 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d            "Fragm
31b60 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25  ented space is %
31b70 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20  d byte reported 
31b80 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  as %d on page %d
31b90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  ",.          cnt
31ba0 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69  , data[hdr+7], i
31bb0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
31bc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
31bd0 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  hit);..  release
31be0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
31bf0 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d  eturn depth+1;.}
31c00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31c10 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
31c20 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
31c30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
31c40 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
31c50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31c60 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74  e does a complet
31c70 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67  e check of the g
31c80 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e  iven BTree file.
31c90 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20    aRoot[] is.** 
31ca0 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65  an array of page
31cb0 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65  s numbers were e
31cc0 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ach page number 
31cd0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
31ce0 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20   of.** a table. 
31cf0 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75   nRoot is the nu
31d00 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
31d10 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  in aRoot..**.** 
31d20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68  If everything ch
31d30 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72  ecks out, this r
31d40 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
31d50 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69  ULL.  If somethi
31d60 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20  ng is.** amiss, 
31d70 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
31d80 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
31d90 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
31da0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a   from malloc().*
31db0 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  * and a pointer 
31dc0 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65  to that error me
31dd0 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65  ssage is returne
31de0 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  d.  The calling 
31df0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
31e00 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
31e10 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72  reeing the error
31e20 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74   message when it
31e30 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61   is done..*/.cha
31e40 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49  r *sqlite3BtreeI
31e50 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20  ntegrityCheck(. 
31e60 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f   Btree *p,     /
31e70 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62  * The btree to b
31e80 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69  e checked */.  i
31e90 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20  nt *aRoot,   /* 
31ea0 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74  An array of root
31eb0 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66   pages numbers f
31ec0 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72  or individual tr
31ed0 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ees */.  int nRo
31ee0 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ot,    /* Number
31ef0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
31f00 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Root[] */.  int 
31f10 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f  mxErr,    /* Sto
31f20 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f  p reporting erro
31f30 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61  rs after this ma
31f40 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ny */.  int *pnE
31f50 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e  rr    /* Write n
31f60 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
31f70 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72  seen to this var
31f80 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  iable */.){.  in
31f90 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b  t i;.  int nRef;
31fa0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73  .  IntegrityCk s
31fb0 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65  Check;.  BtShare
31fc0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
31fd0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
31fe0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 52 65 66  Enter(p);.  nRef
31ff0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
32000 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
32010 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  ger);.  if( lock
32020 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
32030 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
32040 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
32050 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
32060 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44  turn sqlite3StrD
32070 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63  up("Unable to ac
32080 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63  quire a read loc
32090 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
320a0 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  e");.  }.  sChec
320b0 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73  k.pBt = pBt;.  s
320c0 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70  Check.pPager = p
320d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43  Bt->pPager;.  sC
320e0 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c  heck.nPage = sql
320f0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
32100 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
32110 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72  );.  sCheck.mxEr
32120 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68  r = mxErr;.  sCh
32130 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20  eck.nErr = 0;.  
32140 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e  *pnErr = 0;.#ifn
32150 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32160 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
32170 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20   pBt->nTrunc!=0 
32180 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50  ){.    sCheck.nP
32190 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  age = pBt->nTrun
321a0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
321b0 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
321c0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
321d0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
321e0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
321f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
32200 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32210 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
32220 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
32230 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b  ( (sCheck.nPage+
32240 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
32250 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20  .anRef[0]) );.  
32260 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65  if( !sCheck.anRe
32270 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  f ){.    unlockB
32280 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
32290 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20  );.    *pnErr = 
322a0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  1;.    sqlite3Bt
322b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
322c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d   return sqlite3M
322d0 50 72 69 6e 74 66 28 70 2d 3e 70 53 71 6c 69 74  Printf(p->pSqlit
322e0 65 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61  e, "Unable to ma
322f0 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20  lloc %d bytes", 
32300 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b  .        (sCheck
32310 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
32320 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
32330 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ));.  }.  for(i=
32340 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  0; i<=sCheck.nPa
32350 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b  ge; i++){ sCheck
32360 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d  .anRef[i] = 0; }
32370 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42  .  i = PENDING_B
32380 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20  YTE_PAGE(pBt);. 
32390 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e   if( i<=sCheck.n
323a0 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65  Page ){.    sChe
323b0 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b  ck.anRef[i] = 1;
323c0 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45  .  }.  sCheck.zE
323d0 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rrMsg = 0;..  /*
323e0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
323f0 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
32400 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63  list.  */.  chec
32410 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31  kList(&sCheck, 1
32420 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  , get4byte(&pBt-
32430 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
32440 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2]),.           
32450 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
32460 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
32470 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69  ]), "Main freeli
32480 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68  st: ");..  /* Ch
32490 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c  eck all the tabl
324a0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
324b0 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73  =0; i<nRoot && s
324c0 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
324d0 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74  ){.    if( aRoot
324e0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
324f0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
32500 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32510 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
32520 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f  utoVacuum && aRo
32530 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  ot[i]>1 ){.     
32540 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43   checkPtrmap(&sC
32550 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
32560 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
32570 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   0, 0);.    }.#e
32580 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
32590 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20  eePage(&sCheck, 
325a0 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69  aRoot[i], 0, "Li
325b0 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
325c0 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
325d0 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
325e0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
325f0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
32600 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
32610 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
32620 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
32630 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
32640 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32650 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
32660 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
32670 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32680 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
32690 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
326a0 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
326b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
326c0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
326d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
326e0 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
326f0 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
32700 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
32710 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
32720 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
32730 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
32740 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
32750 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
32760 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
32770 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
32780 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
32790 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
327a0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
327b0 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
327c0 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
327d0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
327e0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
327f0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
32800 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
32810 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
32820 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
32830 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
32840 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
32850 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
32860 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
32870 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32880 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
32890 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
328a0 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
328b0 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
328c0 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
328d0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
328e0 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
328f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
32900 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
32910 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
32920 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
32930 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
32940 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
32950 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
32960 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
32970 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
32980 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
32990 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
329a0 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
329b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
329c0 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
329d0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
329e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
329f0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
32a00 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
32a10 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43  );.  *pnErr = sC
32a20 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74  heck.nErr;.  ret
32a30 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d  urn sCheck.zErrM
32a40 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sg;.}.#endif /* 
32a50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32a60 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
32a70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
32a80 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
32a90 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
32aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
32ab0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
32ac0 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61  filename is inva
32ad0 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
32ae0 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
32af0 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
32b00 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
32b10 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
32b20 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
32b30 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
32b40 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
32b50 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
32b60 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
32b70 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
32b80 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
32b90 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  Filename(p->pBt-
32ba0 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  >pPager);.}../*.
32bb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
32bc0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  thname of the di
32bd0 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
32be0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
32bf0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
32c00 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6f  he pager directo
32c10 72 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61 72  ry name is invar
32c20 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20  iant as long as 
32c30 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20  the pager is.** 
32c40 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61  open so it is sa
32c50 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74  fe to access wit
32c60 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65  hout the BtShare
32c70 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73  d mutex..*/.cons
32c80 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
32c90 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42  treeGetDirname(B
32ca0 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
32cb0 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
32cc0 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
32cd0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 69  n sqlite3PagerDi
32ce0 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  rname(p->pBt->pP
32cf0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
32d00 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
32d10 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
32d20 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73  al file for this
32d30 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 72   database. The r
32d40 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f  eturn.** value o
32d50 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
32d60 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61 72  s the same regar
32d70 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
32d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32d90 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
32da0 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a  eated or not..**
32db0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f  .** The pager jo
32dc0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
32dd0 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
32de0 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
32df0 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
32e00 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
32e10 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
32e20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
32e30 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
32e40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
32e50 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20  urnalname(Btree 
32e60 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
32e70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
32e80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
32e90 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
32ea0 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
32eb0 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ger);.}..#ifndef
32ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
32ed0 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  UUM./*.** Copy t
32ee0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
32ef0 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69  ent of pBtFrom i
32f00 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72  nto pBtTo.  A tr
32f10 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73  ansaction.** mus
32f20 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20  t be active for 
32f30 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  both files..**.*
32f40 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69  * The size of fi
32f50 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62  le pBtFrom may b
32f60 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
32f70 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
32f80 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
32f90 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
32fa0 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72  saction on pBtFr
32fb0 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  om is rolled bac
32fc0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
32fd0 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42   btreeCopyFile(B
32fe0 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
32ff0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
33000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33010 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c    Pgno i, nPage,
33020 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b   nToPage, iSkip;
33030 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ..  BtShared *pB
33040 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a  tTo = pTo->pBt;.
33050 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46    BtShared *pBtF
33060 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  rom = pFrom->pBt
33070 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e  ;..  if( pTo->in
33080 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
33090 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54  TE || pFrom->inT
330a0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
330b0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
330c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
330d0 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70  }.  if( pBtTo->p
330e0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
330f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e  SQLITE_BUSY;.  n
33100 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  ToPage = sqlite3
33110 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
33120 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20  BtTo->pPager);. 
33130 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
33140 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
33150 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b  BtFrom->pPager);
33160 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49  .  iSkip = PENDI
33170 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33180 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  To);.  for(i=1; 
33190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
331a0 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b   i<=nPage; i++){
331b0 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62  .    DbPage *pDb
331c0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d  Page;.    if( i=
331d0 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75  =iSkip ) continu
331e0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
331f0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
33200 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  rom->pPager, i, 
33210 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  &pDbPage);.    i
33220 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
33230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33240 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42  agerOverwrite(pB
33250 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
33260 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
33270 61 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20  ata(pDbPage));. 
33280 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
33290 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
332a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
332b0 66 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69 6e  file is shrinkin
332c0 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20 70  g, journal the p
332d0 61 67 65 73 20 74 68 61 74 20 61 72 65 20 62 65  ages that are be
332e0 69 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20 20  ing truncated.  
332f0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ** so that they 
33300 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
33310 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  ck if the commit
33320 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66   fails..  */.  f
33330 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63  or(i=nPage+1; rc
33340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
33350 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b  <=nToPage; i++){
33360 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62  .    DbPage *pDb
33370 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d  Page;.    if( i=
33380 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75  =iSkip ) continu
33390 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
333a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54  te3PagerGet(pBtT
333b0 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
333c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
333d0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
333e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
333f0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
33400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
33410 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50  erDontWrite(pDbP
33420 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65 61  age);.    /* Yea
33430 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65  h.  It seems wie
33440 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57  rd to call DontW
33450 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74  rite() right aft
33460 65 72 20 57 72 69 74 65 28 29 2e 20 20 42 75 74  er Write().  But
33470 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
33480 62 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  because the name
33490 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65  s of those proce
334a0 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61  dures do not exa
334b0 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65 70  ctly .    ** rep
334c0 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79  resent what they
334d0 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65   do.  Write() re
334e0 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20  ally means "put 
334f0 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65  this page in the
33500 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
33510 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72   journal and mar
33520 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f  k it as dirty so
33530 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
33540 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
33550 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
33560 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f  file later."  Do
33570 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73  ntWrite() undoes
33580 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74   the second part
33590 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74 20   of.    ** that 
335a0 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65  and prevents the
335b0 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
335c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
335d0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a 20  database.  The. 
335e0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74     ** page is st
335f0 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  ill on the rollb
33600 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f  ack journal, tho
33610 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69  ugh.  And that i
33620 73 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20  s the whole.    
33630 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73  ** point of this
33640 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70 61   loop: to put pa
33650 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  ges on the rollb
33660 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ack journal. */.
33670 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33680 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33690 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26    }.  if( !rc &&
336a0 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29   nPage<nToPage )
336b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
336c0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
336d0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e  pBtTo->pPager, n
336e0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
336f0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
33700 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
33710 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pTo);.  }.  ret
33720 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20  urn rc;  .}.int 
33730 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79  sqlite3BtreeCopy
33740 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c  File(Btree *pTo,
33750 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a   Btree *pFrom){.
33760 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
33770 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54  te3BtreeEnter(pT
33780 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  o);.  sqlite3Btr
33790 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a  eeEnter(pFrom);.
337a0 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79    rc = btreeCopy
337b0 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29  File(pTo, pFrom)
337c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
337d0 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20  Leave(pFrom);.  
337e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
337f0 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e  e(pTo);.  return
33800 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
33810 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  * SQLITE_OMIT_VA
33820 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  CUUM */../*.** R
33830 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
33840 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
33850 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
33860 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
33870 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  InTrans(Btree *p
33880 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
33890 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
338a0 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69  ex_held(p->pSqli
338b0 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
338c0 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d  return (p && (p-
338d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
338e0 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  WRITE));.}../*.*
338f0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
33900 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  o if a statement
33910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
33920 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
33930 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53  qlite3BtreeIsInS
33940 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
33950 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33960 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33970 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  p) );.  return (
33980 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74  p->pBt && p->pBt
33990 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  ->inStmt);.}../*
339a0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
339b0 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f  ero if a read (o
339c0 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
339d0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
339e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
339f0 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
33a00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
33a10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33a20 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c  tex_held(p->pSql
33a30 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
33a40 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
33a50 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
33a60 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NONE));.}../*.*
33a70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33a80 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
33a90 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d  r to a blob of m
33aa0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
33ab0 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c   with.** a singl
33ac0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20  e shared-btree. 
33ad0 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  The memory is us
33ae0 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64  ed by client cod
33af0 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a  e for it's own.*
33b00 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20  * purposes (for 
33b10 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72  example, to stor
33b20 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73  e a high-level s
33b30 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64  chema associated
33b40 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68   with .** the sh
33b50 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65  ared-btree). The
33b60 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e   btree layer man
33b70 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63  ages reference c
33b80 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a  ounting issues..
33b90 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
33ba0 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c  time this is cal
33bb0 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d  led on a shared-
33bc0 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79  btree, nBytes by
33bd0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  tes of memory.**
33be0 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
33bf0 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75  zeroed, and retu
33c00 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
33c10 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62  er. For each sub
33c20 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c  sequent .** call
33c30 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61   the nBytes para
33c40 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
33c50 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
33c60 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a  o the same blob.
33c70 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74  ** of memory ret
33c80 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75  urned. .**.** Ju
33c90 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68  st before the sh
33ca0 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c  ared-btree is cl
33cb0 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  osed, the functi
33cc0 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
33cd0 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d   .** xFree argum
33ce0 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d  ent when the mem
33cf0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  ory allocation w
33d00 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b  as made is invok
33d10 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c  ed on the .** bl
33d20 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  ob of allocated 
33d30 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e  memory. This fun
33d40 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
33d50 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72   call sqlite3_fr
33d60 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ee().** on the m
33d70 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65  emory, the btree
33d80 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74   layer does that
33d90 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
33da0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74  e3BtreeSchema(Bt
33db0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  ree *p, int nByt
33dc0 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29  es, void(*xFree)
33dd0 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53  (void *)){.  BtS
33de0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
33df0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
33e00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
33e10 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61  f( !pBt->pSchema
33e20 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63   ){.    pBt->pSc
33e30 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61  hema = sqlite3Ma
33e40 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29  llocZero(nBytes)
33e50 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65  ;.    pBt->xFree
33e60 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a  Schema = xFree;.
33e70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
33e80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
33e90 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d  turn pBt->pSchem
33ea0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
33eb0 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68  rn true if anoth
33ec0 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73  er user of the s
33ed0 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65  ame shared btree
33ee0 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
33ef0 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73  .** handle holds
33f00 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
33f10 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  ck on the sqlite
33f20 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a  _master table..*
33f30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
33f40 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42  eeSchemaLocked(B
33f50 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
33f60 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
33f70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33f80 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74  (p->pSqlite->mut
33f90 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
33fa0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
33fb0 20 72 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c   rc = (queryTabl
33fc0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
33fd0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
33fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  !=SQLITE_OK);.  
33ff0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34000 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
34010 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  c;.}...#ifndef S
34020 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
34030 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62  D_CACHE./*.** Ob
34040 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  tain a lock on t
34050 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72  he table whose r
34060 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62  oot page is iTab
34070 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69  .  The.** lock i
34080 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  s a write lock i
34090 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73  f isWritelock is
340a0 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20   true or a read 
340b0 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73  lock.** if it is
340c0 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73   false..*/.int s
340d0 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54  qlite3BtreeLockT
340e0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
340f0 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72  nt iTab, u8 isWr
34100 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  iteLock){.  int 
34110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34120 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20    u8 lockType = 
34130 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49  (isWriteLock?WRI
34140 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43  TE_LOCK:READ_LOC
34150 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K);.  sqlite3Btr
34160 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
34170 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
34180 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54  k(p, iTab, lockT
34190 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ype);.  if( rc==
341a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
341b0 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
341c0 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70  p, iTab, lockTyp
341d0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
341e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
341f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
34200 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
34210 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
34220 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  LOB./*.** Argume
34230 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20  nt pCsr must be 
34240 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
34250 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61  for writing on a
34260 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62  n .** INTKEY tab
34270 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  le currently poi
34280 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
34290 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a   table entry. .*
342a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
342b0 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74  modifies the dat
342c0 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  a stored as part
342d0 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a   of that entry..
342e0 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61  ** Only the data
342f0 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c   content may onl
34300 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  y be modified, i
34310 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
34320 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  e.** to change t
34330 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
34340 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f   data stored..*/
34350 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34360 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f  ePutData(BtCurso
34370 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66  r *pCsr, u32 off
34380 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
34390 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74  id *z){.  assert
343a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
343b0 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73  ex(pCsr) );.  as
343c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
343d0 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70  tex_held(pCsr->p
343e0 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e  Btree->pSqlite->
343f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
34400 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62  rt(pCsr->isIncrb
34410 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66  lobHandle);.  if
34420 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCsr->eState==
34430 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
34440 45 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  EK ){.    return
34450 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
34460 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73   }..  /* Check s
34470 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e  ome precondition
34480 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74  s: .  **   (a) t
34490 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
344a0 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20  n for writing,. 
344b0 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72 65 20   **   (b) there 
344c0 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20  is no read-lock 
344d0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  on the table bei
344e0 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a  ng modified and.
344f0 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63    **   (c) the c
34500 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20  ursor points at 
34510 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61  a valid row of a
34520 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a  n intKey table..
34530 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72    */.  if( !pCsr
34540 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
34550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
34560 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73  ADONLY;.  }.  as
34570 73 65 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74  sert( !pCsr->pBt
34580 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20  ->readOnly .    
34590 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70        && pCsr->p
345a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
345b0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
345c0 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  ;.  if( checkRea
345d0 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74  dLocks(pCsr->pBt
345e0 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52  ree, pCsr->pgnoR
345f0 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20  oot, pCsr) ){.  
34600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34610 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
34620 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
34630 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
34640 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ock */.  }.  if(
34650 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCsr->eState==C
34660 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
34670 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69   !pCsr->pPage->i
34680 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
34690 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
346a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
346b0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
346c0 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  sr, offset, amt,
346d0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
346e0 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f  *)z, 0, 1);.}../
346f0 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  * .** Set a flag
34700 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
34710 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63  to cache the loc
34720 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20  ations of pages 
34730 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65  from the .** ove
34740 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74  rflow list for t
34750 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
34760 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
34770 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
34780 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61  * for incrementa
34790 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a  l blob IO only..
347a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
347b0 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20  ion sets a flag 
347c0 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c  only. The actual
347d0 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63   page location c
347e0 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20  ache.** (stored 
347f0 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  in BtCursor.aOve
34800 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f  rflow[]) is allo
34810 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62  cated and used b
34820 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63  y function.** ac
34830 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74  cessPayload() (t
34840 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69  he worker functi
34850 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74  on for sqlite3Bt
34860 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a  reeData() and.**
34870 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74   sqlite3BtreePut
34880 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64  Data())..*/.void
34890 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 61 63   sqlite3BtreeCac
348a0 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72  heOverflow(BtCur
348b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
348c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
348d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
348e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
348f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
34900 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
34910 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
34920 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73  assert(!pCur->is
34930 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
34940 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d  .  assert(!pCur-
34950 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70  >aOverflow);.  p
34960 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
34970 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e  andle = 1;.}.#en
34980 64 69 66 0a                                      dif.