/ Hex Artifact Content
Login

Artifact 30f7efafc4f5818477b80cf77b3d05acd2805ab7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 32 35 20 32 30 30 37 2f 30  c,v 1.425 2007/0
0190: 39 2f 30 37 20 31 34 3a 33 32 3a 30 37 20 64 72  9/07 14:32:07 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
03a0: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
03b0: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
03c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69   */.#endif....#i
03d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
03e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
03f0: 2a 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69  *.** A flag to i
0400: 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20  ndicate whether 
0410: 6f 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61  or not shared ca
0420: 63 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  che is enabled. 
0430: 20 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74   Also,.** a list
0440: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0450: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0460: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0470: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0480: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0490: 65 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65  e variables have
04a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
04b0: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
04c0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04d0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20  to access these 
04f0: 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20  variables so we 
0500: 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f  make them.** glo
0510: 62 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69  bal for test bui
0520: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  lds..*/.#ifdef S
0530: 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61  QLITE_TEST.BtSha
0540: 72 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72  red *sqlite3Shar
0550: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
0560: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72  .int sqlite3Shar
0570: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0580: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
0590: 20 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74   BtShared *sqlit
05a0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05b0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  t = 0;.static in
05c0: 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  t sqlite3SharedC
05d0: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b  acheEnabled = 0;
05e0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
05f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
0600: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
0610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0620: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0630: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
0640: 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72  disable the shar
0650: 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68  ed pager and sch
0660: 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a  ema features..**
0670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0680: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f   has no effect o
0690: 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
06a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
06b0: 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63  .** The shared c
06c0: 61 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66  ache setting eff
06d0: 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65  ects only future
06e0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
06f0: 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c  ite3_open(), sql
0700: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f  ite3_open16(), o
0710: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
0720: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
0730: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0740: 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62  d_cache(int enab
0750: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68  le){.  sqlite3Sh
0760: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
0770: 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74   = enable;.  ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
0790: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
07a0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
07b0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
07c0: 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
07d0: 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43  (Btree*,Pgno,BtC
07e0: 75 72 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65  ursor*);...#ifde
07f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0800: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
0810: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0820: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0830: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0840: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0850: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09c0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09d0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09e0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09f0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0a00: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
0a10: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a40: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a50: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a60: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a70: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a80: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a90: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0aa0: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0ab0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0ac0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ad0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ae0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0af0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0b00: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0b10: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b20: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b40: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b50: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b60: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b80: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b90: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0ba0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
0bb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
0bc0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
0bd0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61  no-op if the sha
0be0: 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74  red-cache is not
0bf0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
0c00: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  ( !p->sharable )
0c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0c20: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
0c30: 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69  * This (along wi
0c40: 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20  th lockTable()) 
0c50: 69 73 20 77 68 65 72 65 20 74 68 65 20 52 65 61  is where the Rea
0c60: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0c70: 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20  g is.  ** dealt 
0c80: 77 69 74 68 2e 20 49 66 20 74 68 65 20 63 61 6c  with. If the cal
0c90: 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20  ler is querying 
0ca0: 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  for a read-lock 
0cb0: 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73 0a  and the flag is.
0cc0: 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73 20    ** set, it is 
0cd0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20  unconditionally 
0ce0: 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20 69  granted - even i
0cf0: 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69 74  f there are writ
0d00: 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20  e-locks.  ** on 
0d10: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61 20  the table. If a 
0d20: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65  write-lock is re
0d30: 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65 61  quested, the Rea
0d40: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0d50: 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  g.  ** is not co
0d60: 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20  nsidered..  **. 
0d70: 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20   ** In function 
0d80: 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66 20  lockTable(), if 
0d90: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64  a read-lock is d
0da0: 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20  emanded and the 
0db0: 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d  .  ** ReadUncomm
0dc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0dd0: 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61  t, no entry is a
0de0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b  dded to the lock
0df0: 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74  s list .  ** (Bt
0e00: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20  Shared.pLock).. 
0e10: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d   **.  ** To summ
0e20: 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65  arize: If the Re
0e30: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0e40: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
0e50: 72 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f 0a  read cursors do.
0e60: 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65 20    ** not create 
0e70: 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65  or respect table
0e80: 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b   locks. The lock
0e90: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ing procedure fo
0ea0: 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d  r a .  ** write-
0eb0: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
0ec0: 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
0ed0: 66 28 20 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c  f( .    !p->pSql
0ee0: 69 74 65 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28  ite || .    0==(
0ef0: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67  p->pSqlite->flag
0f00: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0f10: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0f20: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0f30: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0f40: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
0f50: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
0f60: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
0f70: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
0f80: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
0f90: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
0fa0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
0fb0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
0fc0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
0fd0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
0fe0: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
0ff0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
1000: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1010: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
1020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1030: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1040: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1050: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1060: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1070: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1080: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
1090: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
10a0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
10b0: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
10c0: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
10d0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
10e0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
10f0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
1100: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
1110: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
1120: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
1130: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1140: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
1150: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
1160: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
1170: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
1180: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
1190: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
11a0: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
11b0: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
11c0: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
11d0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11e0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
11f0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
1200: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1210: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1220: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1230: 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20  tex(p) );..  /* 
1240: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1250: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1260: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1270: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1280: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
12c0: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
12d0: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
12e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
12f0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1300: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
1310: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
1320: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
1330: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
1340: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1350: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1360: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1370: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1380: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
1390: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
13a0: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
13b0: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
13c0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
13d0: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
13e0: 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74   .    (p->pSqlit
13f0: 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e 70  e) && .    (p->p
1400: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
1410: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1420: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
1430: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
1440: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1450: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1470: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1480: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
1490: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
14a0: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
14b0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
14c0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
14d0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
14e0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
14f0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
1500: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1510: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
1520: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
1530: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
1540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1550: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1560: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1570: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
1580: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
1590: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
15a0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
15b0: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
15c0: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
15d0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
15e0: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
15f0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
1600: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
1610: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1620: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
1630: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1660: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1670: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
1680: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
1690: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
16a0: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16b0: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
16c0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
16d0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
16e0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
16f0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1700: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
1710: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
1720: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
1730: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
1740: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1750: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1760: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1770: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
1780: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
1790: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
17a0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
17b0: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
17c0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
17d0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
17e0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
17f0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
1800: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
1810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1820: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
1830: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1840: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1850: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1860: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1870: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
1880: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
1890: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
18a0: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
18b0: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
18c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
18d0: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
18e0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
18f0: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
1900: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
1910: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
1920: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1930: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1940: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1950: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
1960: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
1970: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
1980: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
1990: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
19a0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 69  = *ppIter;.    i
19b0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
19c0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
19d0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
19e0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
19f0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a10: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1a20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1a30: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
1a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a50: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
1a60: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
1a70: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1a80: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
1a90: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
1aa0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
1ab0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
1ac0: 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  s a mutex on the
1ad0: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
1ae0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1af0: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
1b00: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
1b10: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
1b20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b30: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
1b40: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
1b50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b60: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1b70: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
1b80: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1b90: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1ba0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bc0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1bd0: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1be0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
1bf0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c00: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
1c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1c20: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
1c30: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1c40: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1c50: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1c60: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1c70: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
1c80: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
1c90: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
1ca0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
1cb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1cc0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
1cd0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
1ce0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1cf0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
1d00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d10: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1d20: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
1d30: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1d40: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1d50: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1d60: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
1d70: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
1d80: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
1d90: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20  erflowCache(x). 
1da0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1db0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1dc0: 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  che(x).#endif../
1dd0: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
1de0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1df0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
1e00: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
1e10: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
1e20: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
1e30: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
1e40: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
1e50: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
1e60: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
1e70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
1e80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ea0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
1ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
1ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f10: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1f20: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
1f30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f40: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
1f50: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
1f60: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
1f70: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
1f80: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
1f90: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
1fa0: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
1fb0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
1fc0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
1fd0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
1fe0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
1ff0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
2000: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
2010: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
2020: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
2030: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
2040: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
2050: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
2060: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2070: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70  OK && 0==pCur->p
2080: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
2090: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
20a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
20b0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
20c0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
20d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20e0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
20f0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
2100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2120: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
2130: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
2140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2150: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
2160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2180: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
21a0: 28 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ( !pCur->pPage->
21b0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
21c0: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
21d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
21f0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2200: 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2210: 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   0;.    pCur->eS
2220: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
2230: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
2240: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
2250: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
2260: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2270: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
2280: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
2290: 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20   cursors except 
22a0: 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20  pExcept open on 
22b0: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69  the table .** wi
22c0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
22d0: 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  ot. Usually, thi
22e0: 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  s is called just
22f0: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a   before cursor.*
2300: 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  * pExcept is use
2310: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  d to modify the 
2320: 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65  table (BtreeDele
2330: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
2340: 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ert())..*/.stati
2350: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
2360: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
2370: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
2380: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
2390: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
23a0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
23b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
23d0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
23e0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
23f0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
2400: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
2410: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
2420: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
2430: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
2440: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
2450: 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20  ==iRoot) && .   
2460: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
2470: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2480: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
2490: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
24a0: 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(p);.      if( 
24b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
24c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24d0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
24e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
24f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2500: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
2510: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2520: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2530: 76 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f 72  void clearCursor
2540: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
2550: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
2560: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2570: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2580: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2590: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
25a0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
25b0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
25d0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
25e0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
25f0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
2600: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
2610: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
2620: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
2630: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
2640: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
2650: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
2660: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
2670: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
2680: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
2690: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
26a0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
26b0: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
26c0: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
26d0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
26e0: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
26f0: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
2700: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2710: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
2720: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2730: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
2740: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
2750: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
2760: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
2770: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
2780: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
2790: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
27a0: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
27b0: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
27c0: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
27d0: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69  OR_INVALID..*/.i
27e0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
27f0: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2800: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2810: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2820: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2830: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2840: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2850: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2860: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2870: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
2880: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2890: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
28a0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28b0: 69 70 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ip;.  }.#ifndef 
28c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
28d0: 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75 72 2d  BLOB.  if( pCur-
28e0: 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
28f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2900: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
2910: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75 72 2d  }.#endif.  pCur-
2920: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2930: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
2940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2950: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
2960: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
2970: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2980: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2990: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
29a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
29b0: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
29c0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
29d0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29e0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29f0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2a00: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2a10: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2a30: 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  e restoreOrClear
2a40: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2a50: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
2a60: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2a70: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
2a80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2a90: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2aa0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
2ab0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
2ac0: 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK)..#ifndef S
2ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2ae0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
2af0: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
2b00: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
2b10: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
2b20: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
2b30: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
2b40: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
2b50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2b60: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
2b70: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
2b80: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
2b90: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
2ba0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2bb0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
2bc0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
2bd0: 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65 74  ge, iPtrMap, ret
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2bf0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2c10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
2c20: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
2c30: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
2c40: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
2c50: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
2c60: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
2c70: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
2c80: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
2c90: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
2ca0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2cb0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
2cc0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
2cd0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
2ce0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
2cf0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
2d00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
2d10: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
2d20: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
2d30: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
2d40: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
2d50: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
2d60: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
2d70: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
2d80: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
2d90: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2da0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
2db0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
2dc0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
2dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2de0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
2df0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
2e00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
2e10: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
2e20: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
2e30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
2e40: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
2e50: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
2e60: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
2e70: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
2e80: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
2e90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
2ea0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
2eb0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
2ec0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
2ed0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2ee0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2ef0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f00: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f10: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
2f20: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
2f30: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
2f40: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
2f50: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
2f60: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
2f70: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
2f80: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
2f90: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
2fa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
2fb0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2fc0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
2fd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fe0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ff0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
3000: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
3010: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
3020: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3030: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
3040: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
3050: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
3070: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
3080: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
3090: 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29  OFFSET(pBt, key)
30a0: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
30b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
30c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
30d0: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
30e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
30f0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
3100: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
3110: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
3120: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
3130: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
3140: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
3150: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
3160: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
3170: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
3180: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
31b0: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
31c0: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
31d0: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
31e0: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
31f0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
3200: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
3210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3220: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
3230: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
3240: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
3250: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
3260: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
3270: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
3280: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
3290: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
32a0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
32b0: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
32c0: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
32d0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
32e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
32f0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
3300: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
3310: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
3320: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
3330: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
3340: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
3350: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
3360: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
3370: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
3380: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
3390: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
33a0: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
33b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
33c0: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
33d0: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
33e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
33f0: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
3400: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
3410: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
3420: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
3430: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
3440: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3450: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3460: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3470: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
3480: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
3490: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
34a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
34c0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
34d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
34e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34f0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
3500: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
3510: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
3520: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
3530: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
3540: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73  (pBt, key);.  as
3550: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
3560: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
3570: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
3580: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
3590: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
35a0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
35b0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
35c0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
35d0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
35e0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
35f0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3600: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
3610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3620: 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
3630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
3640: 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
3650: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
3660: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
3670: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
3680: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
3690: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
36a0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
36b0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
36c0: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
36d0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
36e0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
36f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3700: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
3710: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
3720: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3730: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
3740: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ine findCell(pPa
3750: 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28  ge, iCell) \.  (
3760: 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 20 2b  (pPage)->aData +
3770: 20 67 65 74 32 62 79 74 65 28 26 28 70 50 61 67   get2byte(&(pPag
3780: 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61 67 65  e)->aData[(pPage
3790: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
37a0: 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65  (iCell)])).#ifde
37b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 75 38  f SQLITE_TEST.u8
37c0: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69   *sqlite3BtreeFi
37d0: 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  ndCell(MemPage *
37e0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
37f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  ){.  assert( iCe
3800: 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll>=0 );.  asser
3810: 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79 74  t( iCell<get2byt
3820: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
3830: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
3840: 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  +3]) );.  return
3850: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3860: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   iCell);.}.#endi
3870: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  f../*.** This a 
3880: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
3890: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 42  sion of sqlite3B
38a0: 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29 20 74  treeFindCell() t
38b0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
38c0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
38d0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
38e0: 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65  cells.  See inse
38f0: 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  rt.*/.static u8 
3900: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
3910: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
3920: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
3930: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
3940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
3960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
3970: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
3980: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
3990: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
39a0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
39b0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
39c0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
39d0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
39e0: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
39f0: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
3a00: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
3a10: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
3a20: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
3a30: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
3a40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
3a50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
3a60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
3a70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
3a80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
3a90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
3aa0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
3ab0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
3ac0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
3ad0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
3ae0: 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74  function.  sqlit
3af0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3b00: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
3b10: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
3b20: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
3b30: 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65   and sqlite3Btre
3b40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
3b50: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
3b60: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
3b70: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
3b80: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
3b90: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
3ba0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
3bb0: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
3bc0: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
3bd0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71  instead of.** sq
3be0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3bf0: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
3c00: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
3c10: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
3c20: 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
3c30: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3c40: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
3c50: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
3c60: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
3c70: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
3c80: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
3c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3ca0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
3cb0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
3cc0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
3cd0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
3ce0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
3cf0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  .){.  int n;    
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d10: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
3d20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
3d30: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
3d40: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
3d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d60: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
3d70: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
3d80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
3da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
3db0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
3dc0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
3dd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
3de0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
3df0: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
3e00: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
3e10: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
3e20: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
3e30: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
3e40: 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67  ta ){.    n += g
3e50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
3e60: 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29  l[n], &nPayload)
3e70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3e80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d  Payload = 0;.  }
3e90: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20  .  pInfo->nData 
3ea0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66  = nPayload;.  if
3eb0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
3ec0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3ed0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
3ee0: 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e   (u64 *)&pInfo->
3ef0: 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
3f00: 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e      u32 x;.    n
3f10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3f20: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a  &pCell[n], &x);.
3f30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
3f40: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
3f50: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
3f60: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
3f70: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
3f80: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
3f90: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
3fa0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
3fb0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
3fc0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
3fd0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
3fe0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
3ff0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
4000: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
4010: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
4020: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4030: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
4040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
4050: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
4060: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
4070: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
4080: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
4090: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
40a0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
40b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
40c0: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
40d0: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
40e0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
40f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
4100: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
4110: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4120: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4130: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4140: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4150: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4160: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4170: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4180: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4190: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
41a0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
41b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
41c0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
41d0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
41e0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
41f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
4200: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
4210: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4220: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4230: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4240: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4250: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4260: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4270: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4290: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
42a0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
42b0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
42c0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
42d0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
42e0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
42f0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
4300: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
4310: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4320: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4330: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4340: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4350: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4360: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4370: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4380: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4390: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
43a0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
43b0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
43c0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
43d0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
43e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
43f0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
4400: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
4410: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4420: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4430: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4440: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4450: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4460: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4470: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4480: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4490: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
44a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
44b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
44c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
44d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
44e0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
44f0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
4500: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
4510: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4520: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4530: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4540: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4550: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4560: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4570: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4580: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4590: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
45a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
45b0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
45c0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
45d0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
45e0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
45f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4610: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4620: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4630: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4640: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4650: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4660: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4670: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4680: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4690: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
46a0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
46b0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
46c0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
46d0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
46e0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
46f0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4700: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4710: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4720: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4730: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4740: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4750: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4760: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4770: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4780: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4790: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
47a0: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  int cellSize(Mem
47b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
47c0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
47d0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
47e0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
47f0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4800: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4810: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4820: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
4830: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4850: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4860: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4870: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4880: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4890: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
48a0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
48b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
48d0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
48e0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
48f0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4900: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4910: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4920: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4930: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4940: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4950: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4960: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4970: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4980: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4990: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
49a0: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
49b0: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
49c0: 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nfo;.    sqlite3
49d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
49e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
49f0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
4a00: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4a10: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4a20: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4a30: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4a40: 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
4a50: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4a60: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4a70: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4a80: 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
4a90: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
4aa0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
4ab0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4ac0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
4ad0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
4ae0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
4af0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
4b00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4b20: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
4b30: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
4b40: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
4b50: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4b60: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4b70: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4b80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4b90: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4ba0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4bb0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4bc0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4bd0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
4be0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
4bf0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
4c00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c10: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
4c20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4c30: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
4c40: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
4c50: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
4c60: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
4c70: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
4c80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
4c90: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
4ca0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
4cb0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
4cc0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
4cd0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
4ce0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
4cf0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
4d00: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
4d10: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
4d20: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
4d30: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
4d40: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
4d50: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
4d60: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
4d70: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
4d80: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
4d90: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
4da0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4db0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
4dc0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
4dd0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
4de0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4df0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
4e00: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
4e30: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
4e40: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
4e50: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
4e80: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
4e90: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4eb0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
4ec0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
4ed0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4ee0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
4ef0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
4f00: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
4f10: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
4f20: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
4f30: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
4f40: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
4f50: 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
4f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4f70: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
4f80: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
4f90: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4fb0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
4fc0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
4fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
4fe0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
4ff0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
5000: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5010: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
5020: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
5030: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
5040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5050: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5060: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
5080: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5090: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
50a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
50b0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
50c0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
50d0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
50e0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  temp = sqlite3_m
5130: 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42  alloc( pPage->pB
5140: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
5150: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72   if( temp==0 ) r
5160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5170: 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  EM;.  data = pPa
5180: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
5190: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
51a0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
51b0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
51c0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
51d0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
51e0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
51f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5200: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
5210: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
5220: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
5230: 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
5240: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5250: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
5260: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
5270: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62  , usableSize - b
5280: 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61  rk);.  brk = usa
5290: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
52a0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
52b0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
52c0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
52d0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
52e0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
52f0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
5300: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
5310: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
5320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
5330: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5340: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
5350: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
5360: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
5370: 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73  ]);.    brk -= s
5380: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ize;.    memcpy(
5390: 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d  &data[brk], &tem
53a0: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
53b0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
53c0: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73  , brk);.  }.  as
53d0: 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f  sert( brk>=cellO
53e0: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
53f0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
5400: 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a  a[hdr+5], brk);.
5410: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
5420: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
5430: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
5440: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
5450: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
5460: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
5470: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62  data[addr], 0, b
5480: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  rk-addr);.  sqli
5490: 74 65 33 5f 66 72 65 65 28 74 65 6d 70 29 3b 0a  te3_free(temp);.
54a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
54b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
54c0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
54d0: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
54e0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
54f0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
5500: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
5510: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
5520: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
5530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20   allocation. Or 
5540: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  return 0 if ther
5550: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
5560: 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e  free.** space on
5570: 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74   the page to sat
5580: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
5590: 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  ion request..**.
55a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
55b0: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
55c0: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
55d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
55e0: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
55f0: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
5600: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
5610: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
5620: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
5630: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
5640: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
5650: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
5660: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
5670: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
5680: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
5690: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
56a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
56b0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
56c0: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
56d0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
56e0: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
56f0: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
5700: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
5710: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
5720: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
5730: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
5740: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
5750: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5760: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5770: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5780: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
57a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
57b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
57c0: 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ) );.  if( nByte
57d0: 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a  <4 ) nByte = 4;.
57e0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72    if( pPage->nFr
57f0: 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67  ee<nByte || pPag
5800: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
5810: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61   return 0;.  pPa
5820: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79  ge->nFree -= nBy
5830: 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  te;.  hdr = pPag
5840: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20  e->hdrOffset;.. 
5850: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
5860: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
5870: 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  g<60 ){.    /* S
5880: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
5890: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
58a0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
58b0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
58c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71      ** space req
58d0: 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64  uest. */.    add
58e0: 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77  r = hdr+1;.    w
58f0: 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32  hile( (pc = get2
5900: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
5910: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69  ))>0 ){.      si
5920: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
5930: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
5940: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
5950: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
5960: 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b   size<nByte+4 ){
5970: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5980: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
5990: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
59a0: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
59b0: 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69  +7] = nFrag + si
59c0: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
59d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b        return pc;
59e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
59f0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
5a00: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
5a10: 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20  size-nByte);.   
5a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5a30: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5a40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a50: 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
5a60: 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pc;.    }.  }.. 
5a70: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
5a80: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
5a90: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
5aa0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5ab0: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
5ac0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5ad0: 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  a..  */.  top = 
5ae0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5af0: 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20  dr+5]);.  nCell 
5b00: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5b10: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c  [hdr+3]);.  cell
5b20: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
5b30: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
5b40: 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63  ( nFrag>=60 || c
5b50: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5b60: 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74  ell > top - nByt
5b70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66  e ){.    if( def
5b80: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
5b90: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5ba0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5bb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5bc0: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5bd0: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5be0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5bf0: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5c00: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5c10: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5c20: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5c30: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5c40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5c50: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5c60: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5c70: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5c80: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5c90: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5ca0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5cb0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5cc0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5cd0: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5ce0: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5cf0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5d00: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5d10: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5d20: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5d30: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5d40: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5d50: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
5d60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5d70: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
5d80: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5d90: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
5da0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5db0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
5dc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
5dd0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5df0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5e00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5e10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
5e20: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
5e30: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
5e40: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
5e50: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
5e60: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
5e70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5e80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5e90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5ea0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5eb0: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20  );.  if( size<4 
5ec0: 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66  ) size = 4;..#if
5ed0: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
5ee0: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
5ef0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
5f00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
5f10: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
5f20: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
5f30: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
5f40: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
5f50: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
5f60: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
5f70: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
5f80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
5f90: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
5fa0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
5fb0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
5fc0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
5fd0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
5fe0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
5ff0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
6000: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
6010: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
6020: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
6030: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6040: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6050: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
6060: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6070: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
6080: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
6090: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
60a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
60b0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
60c0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
60d0: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
60e0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
60f0: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
6100: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6110: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
6120: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6130: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
6140: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
6150: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
6160: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
6170: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
6180: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
6190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
61a0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
61b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
61c0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
61d0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
61e0: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
61f0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
6200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6210: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6220: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6230: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
6240: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6250: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
6260: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
6270: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
6280: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
6290: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
62a0: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
62b0: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
62c0: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
62d0: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
62e0: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
62f0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
6300: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
6310: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
6320: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
6330: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
6340: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
6350: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6360: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
6370: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
6380: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
6390: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
63a0: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
63b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
63c0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
63d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
63e0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
63f0: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
6400: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
6410: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
6420: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
6430: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
6440: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
6450: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
6460: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
6470: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6480: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
6490: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
64a0: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
64b0: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
64c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
64d0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
64e0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
64f0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
6500: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6510: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
6520: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
6530: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
6540: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6550: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6560: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
6570: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
6580: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
6590: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
65a0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
65b0: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61  c void decodeFla
65c0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
65d0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
65e0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
65f0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
6600: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
6610: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
6620: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
6630: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
6640: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6650: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6660: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6670: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6680: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6690: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
66a0: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
66b0: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
66c0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
66d0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
66e0: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
66f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
6700: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
6710: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
6720: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
6730: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
6740: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
6750: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
6760: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6770: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
6780: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
6790: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
67a0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
67b0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
67c0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
67d0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
67e0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
67f0: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
6800: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6810: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
6820: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
6830: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
6840: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
6850: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
6860: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6870: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
6880: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
6890: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
68a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
68b0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
68c0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
68d0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
68e0: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
68f0: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
6900: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
6910: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
6920: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
6930: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
6940: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
6950: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
6960: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
6970: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
6980: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
6990: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
69b0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
69c0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
69d0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
69e0: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
69f0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
6a00: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
6a10: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
6a20: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
6a30: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
6a40: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
6a50: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
6a60: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
6a70: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
6a80: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
6a90: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
6aa0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
6ab0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6ac0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20  BtreeInitPage(. 
6ad0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6ae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6af0: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
6b00: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
6b10: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
6b20: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
6b30: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
6b40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
6b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6b60: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
6b70: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
6b80: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
6b90: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
6ba0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6bb0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
6bc0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
6bd0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
6be0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
6bf0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
6c00: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
6c20: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
6c30: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
6c40: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
6c50: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
6c60: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
6c70: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
6c80: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
6c90: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
6ca0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
6cb0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
6cc0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
6cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ce0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
6cf0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
6d00: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
6d10: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
6d20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
6d30: 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42  nt area */..  pB
6d40: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6d50: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
6d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d70: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
6d80: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
6d90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6da0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6db0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6dc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
6dd0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
6de0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
6df0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6e00: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
6e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
6e20: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
6e30: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6e40: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
6e50: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
6e60: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
6e70: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
6e80: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
6e90: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
6ea0: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
6eb0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
6ec0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
6ed0: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
6ee0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
6ef0: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
6f00: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
6f10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6f20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
6f30: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
6f40: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
6f50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
6f60: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
6f70: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
6f80: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
6f90: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
6fa0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
6fb0: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
6fc0: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
6fd0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
6fe0: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
6ff0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
7000: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7010: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
7020: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
7030: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
7040: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
7050: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
7060: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
7070: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
7080: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
7090: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
70a0: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
70b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
70c0: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
70d0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
70e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
70f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
7100: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
7110: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
7120: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
7130: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
7140: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
7150: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
7160: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7170: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
7180: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
7190: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
71a0: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
71b0: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
71c0: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
71d0: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
71e0: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
71f0: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
7200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7210: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7220: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
7230: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
7240: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
7250: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
7260: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
7270: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
7280: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
7290: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
72a0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
72b0: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
72c0: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
72d0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
72e0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
72f0: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
7300: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
7310: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
7320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7330: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
7340: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
7350: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
7360: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
7370: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
7380: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
7390: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
73a0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
73b0: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
73c0: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
73d0: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
73e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
73f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7400: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
7410: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
7420: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
7430: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
7440: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
7450: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
7460: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7470: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7480: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
7490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
74a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
74b0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d 3e 69  .  }..  pPage->i
74c0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  sInit = 1;.  ret
74d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
74e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
74f0: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
7500: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
7510: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
7520: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
7530: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
7540: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
7550: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
7560: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
7570: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7580: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7590: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
75a0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
75b0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
75c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
75d0: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
75e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
75f0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
7600: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
7610: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
7620: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7630: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
7640: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
7650: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
7660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7670: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
7680: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
7690: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
76a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
76b0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
76c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
76d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
76e0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
76f0: 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  tex) );.  memset
7700: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
7710: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7720: 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68  - hdr);.  data[h
7730: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
7740: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
7750: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
7760: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
7770: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
7780: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
7790: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
77a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
77b0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
77c0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
77d0: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
77e0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
77f0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7800: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
7810: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
7820: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
7830: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
7840: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
7850: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
7860: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
7870: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0;.  pPage->nCel
7880: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
7890: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  isInit = 1;.}../
78a0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
78b0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
78c0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
78d0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
78e0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
78f0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
7900: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
7910: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
7920: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
7930: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
7940: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
7950: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
7960: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
7970: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
7980: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
7990: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
79a0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
79b0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
79c0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
79d0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
79e0: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
79f0: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
7a00: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
7a10: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
7a20: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
7a30: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
7a40: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
7a50: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
7a60: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
7a70: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
7a80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7a90: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
7aa0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
7ab0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
7ac0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
7ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ae0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
7af0: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
7b00: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
7b10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
7b20: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
7b30: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
7b40: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
7b50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
7b60: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
7b70: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
7b80: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
7b90: 20 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67   *pPage;.  DbPag
7ba0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
7bb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7bc0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7bd0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
7be0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
7bf0: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
7c00: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
7c10: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
7c20: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
7c30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
7c40: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
7c50: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7c60: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
7c70: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
7c80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
7c90: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7ca0: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
7cb0: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
7cc0: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
7cd0: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
7ce0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
7cf0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7d00: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
7d10: 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  : 0;.  *ppPage =
7d20: 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   pPage;.  return
7d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7d40: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
7d50: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
7d60: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
7d70: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
7d80: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
7d90: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
7da0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
7db0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
7dc0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7dd0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
7de0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
7df0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
7e00: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
7e10: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
7e20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
7e30: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e40: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
7e50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7e60: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
7e70: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
7e80: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
7e90: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
7ea0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
7eb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
7ec0: 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  t     /* Parent 
7ed0: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29  of the page */.)
7ee0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
7ef0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7f00: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7f10: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7f20: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
7f30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7f40: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20  PT_BKPT; .  }.  
7f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
7f60: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
7f70: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
7f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7f90: 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29  _OK && (*ppPage)
7fa0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
7fb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
7fc0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
7fd0: 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  Page, pParent);.
7fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
8000: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
8010: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
8020: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
8030: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
8040: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
8050: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
8060: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
8070: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8080: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
8090: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
80a0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
80b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
80c0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
80d0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
80e0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
80f0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
8100: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  id*)pPage );.   
8110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8120: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
8130: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
8140: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
8150: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8160: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8170: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
8190: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
81a0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
81b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
81c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
81d0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
81e0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
81f0: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
8200: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
8210: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
8220: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
8230: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
8240: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8250: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
8260: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8270: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8280: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
8290: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
82a0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
82b0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
82c0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
82d0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
82e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
82f0: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  sInit==0 || sqli
8300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8310: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8320: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
8330: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
8340: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
8350: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
8360: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
8370: 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50  pParent->pBt==pP
8380: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
8390: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
83a0: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
83b0: 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
83c0: 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
83d0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
83e0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
83f0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
8400: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
8410: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
8420: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
8430: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
8440: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
8450: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
8460: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
8470: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
8480: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
8490: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
84a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
84b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
84c0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
84d0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
84e0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
84f0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
8500: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
8510: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
8520: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
8530: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
8540: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8550: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8560: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
8570: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
8580: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
8590: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
85a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
85b0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
85c0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
85d0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
85e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
85f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8600: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
8610: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
8620: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
8630: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
8640: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
8650: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
8660: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
8670: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
8680: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
8690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
86a0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
86b0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
86c0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
86d0: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
86e0: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
86f0: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
8700: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
8710: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
8720: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
8730: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
8740: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
8750: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
8760: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
8770: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8780: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
8790: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
87a0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
87b0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
87c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
87d0: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
87e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
87f0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
8800: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8810: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
8820: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
8830: 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20  ite3 *pSqlite,  
8840: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
8850: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
8860: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
8870: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
8880: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
8890: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
88a0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
88b0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
88c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
88d0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
88e0: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
88f0: 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
8900: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
8910: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8920: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
8930: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
8940: 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73  /* The VFS to us
8950: 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65  e for this btree
8960: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
8970: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  pBt = 0;      /*
8980: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
8990: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
89a0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89c0: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
89d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
89e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
89f0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69  nReserve;.  unsi
8a00: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
8a10: 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20  der[100];..  /* 
8a20: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
8a30: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
8a40: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
8a50: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
8a60: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
8a70: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
8a80: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
8a90: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
8aa0: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
8ab0: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
8ac0: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
8ad0: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
8ae0: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
8af0: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
8b00: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
8b10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8b20: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
8b30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8b40: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
8b50: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
8b60: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
8b70: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
8b80: 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73  emdb = 0;.  #els
8b90: 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
8ba0: 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e  isMemdb = zFilen
8bb0: 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a  ame && !strcmp(z
8bc0: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
8bd0: 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ry:");.  #endif.
8be0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8bf0: 28 20 70 53 71 6c 69 74 65 21 3d 30 20 29 3b 0a  ( pSqlite!=0 );.
8c00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8c10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 71  3_mutex_held(pSq
8c20: 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  lite->mutex) );.
8c30: 0a 20 20 70 56 66 73 20 3d 20 70 53 71 6c 69 74  .  pVfs = pSqlit
8c40: 65 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  e->pVfs;.  p = s
8c50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
8c60: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
8c70: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
8c80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8c90: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
8ca0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
8cb0: 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74  ONE;.  p->pSqlit
8cc0: 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 23 69  e = pSqlite;..#i
8cd0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8ce0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
8cf0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
8d00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
8d10: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
8d20: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
8d30: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
8d40: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
8d50: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
8d60: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
8d70: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
8d80: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
8d90: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 66 6c  h.  */.  if( (fl
8da0: 61 67 73 20 26 20 42 54 52 45 45 5f 50 52 49 56  ags & BTREE_PRIV
8db0: 41 54 45 29 3d 3d 30 0a 20 20 20 26 26 20 69 73  ATE)==0.   && is
8dc0: 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 28  Memdb==0.   && (
8dd0: 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 26  pSqlite->flags &
8de0: 20 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30   SQLITE_Vtab)==0
8df0: 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  .   && zFilename
8e00: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
8e10: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  .  ){.    if( sq
8e20: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
8e30: 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20  Enabled ){.     
8e40: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
8e50: 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 73  name = (char *)s
8e60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56  qlite3_malloc(pV
8e70: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b  fs->mxPathname);
8e80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
8e90: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
8ea0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
8eb0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
8ec0: 69 66 28 20 70 53 71 6c 69 74 65 20 29 7b 0a 20  if( pSqlite ){. 
8ed0: 20 20 20 20 20 20 20 70 53 71 6c 69 74 65 2d 3e         pSqlite->
8ee0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
8ef0: 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20  SharedCache;.   
8f00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8f10: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
8f20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8f30: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
8f40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
8f60: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
8f70: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
8f80: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c   zFilename, zFul
8f90: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
8fa0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
8fb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
8fc0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
8fd0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
8fe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
8ff0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9000: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9010: 6f 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68  or(pBt=sqlite3Sh
9020: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70  aredCacheList; p
9030: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
9040: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
9050: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
9060: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9070: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
9080: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
9090: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
90a0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
90c0: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
90d0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
90e0: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
90f0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9100: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
9110: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
9120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9150: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
9160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9170: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
9180: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
9190: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
91a0: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
91b0: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
91c0: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
91d0: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
91e0: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
91f0: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
9200: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
9210: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
9220: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
9230: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
9240: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
9250: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
9260: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9270: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
9280: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
9290: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
92a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
92b0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
92c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
92d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
92e0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
92f0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
9300: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
9310: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
9320: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
9330: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
9340: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
9350: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
9360: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
9370: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
9380: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
9390: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
93a0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
93b0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
93c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
93d0: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
93e0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
93f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9400: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
9410: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
9420: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9430: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
9440: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9450: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
9460: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9470: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
9480: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
9490: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
94a0: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
94b0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
94c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
94d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
94e0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
94f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
9500: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
9510: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
9520: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
9530: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9540: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
9550: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
9560: 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  fsFlags);.    if
9570: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9580: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9590: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
95a0: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
95b0: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
95c0: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
95d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
95e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
95f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
9600: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
9610: 20 7d 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20   }.    p->pBt = 
9620: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
9630: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
9640: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
9650: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
9660: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
9670: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
9680: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9690: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
96a0: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
96b0: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
96c0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
96d0: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
96e0: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
96f0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
9700: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
9710: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
9720: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
9730: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
9740: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
9750: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
9760: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
9770: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
9780: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
9790: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
97a0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
97b0: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
97c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
97d0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
97e0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
97f0: 7a 65 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ze);.      pBt->
9800: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 36  maxEmbedFrac = 6
9810: 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20  4;   /* 25% */. 
9820: 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62       pBt->minEmb
9830: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
9840: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 20  * 12.5% */.     
9850: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9860: 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32  c = 32;    /* 12
9870: 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  .5% */.#ifndef S
9880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9890: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
98a0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
98b0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
98c0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
98d0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
98e0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
98f0: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
9900: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
9910: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
9920: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
9930: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
9940: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
9950: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
9960: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
9970: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
9980: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
9990: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
99a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
99b0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
99c0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
99d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
99e0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
99f0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
9a00: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
9a10: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
9a20: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
9a30: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
9a40: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
9a50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
9a60: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
9a70: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
9a80: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
9a90: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9aa0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
9ab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
9ac0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
9ad0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
9ae0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
9af0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
9b00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  .      pBt->maxE
9b10: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
9b20: 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 20 20  ader[21];.      
9b30: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
9b40: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
9b50: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  ];.      pBt->mi
9b60: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
9b70: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 20  eader[23];.     
9b80: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
9b90: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
9ba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9bb0: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
9bc0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
9bd0: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
9be0: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
9bf0: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
9c00: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
9c10: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
9c20: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
9c30: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
9c40: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
9c50: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
9c60: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
9c70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
9c80: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
9c90: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
9ca0: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
9cb0: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ageSize */.    s
9cc0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
9cd0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
9ce0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
9cf0: 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65  ze);.   .#if !de
9d00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9d10: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9d20: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
9d30: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
9d40: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
9d50: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
9d60: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
9d70: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
9d80: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
9d90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
9da0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
9db0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
9dc0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
9dd0: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
9de0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
9df0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
9e00: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
9e10: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
9e20: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
9e30: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9e40: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
9e50: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
9e60: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
9e70: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
9e80: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
9e90: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
9ea0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
9eb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9ec0: 20 20 20 20 70 53 71 6c 69 74 65 2d 3e 6d 61 6c      pSqlite->mal
9ed0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
9ee0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
9ef0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
9f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9f20: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
9f30: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
9f40: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
9f50: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
9f60: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9f70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
9f80: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
9f90: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9fa0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9fb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
9fc0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9fe0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a000: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
a010: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
a020: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
a030: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
a040: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
a050: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
a060: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
a070: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
a080: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
a090: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
a0a0: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
a0b0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
a0c0: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
a0d0: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
a0e0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
a0f0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
a100: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
a110: 69 3c 70 53 71 6c 69 74 65 2d 3e 6e 44 62 3b 20  i<pSqlite->nDb; 
a120: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
a130: 28 70 53 69 62 20 3d 20 70 53 71 6c 69 74 65 2d  (pSib = pSqlite-
a140: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
a150: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
a160: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
a170: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
a180: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
a190: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
a1a0: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
a1b0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
a1c0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
a1d0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
a1e0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
a1f0: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
a200: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
a210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a220: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
a230: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
a240: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
a250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
a260: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
a270: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a280: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
a290: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
a2a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
a2b0: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
a2c0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
a2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a2e0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
a2f0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
a300: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
a310: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
a320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
a330: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a340: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a350: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
a360: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
a370: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a380: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
a390: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
a3a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a3b0: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
a3c0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
a3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a3e0: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
a3f0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
a400: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
a410: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a420: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
a430: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
a440: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
a450: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
a460: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
a470: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
a480: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
a490: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
a4a0: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
a4b0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
a4c0: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
a4d0: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
a4e0: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
a4f0: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
a500: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a510: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
a520: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
a530: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
a540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a550: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
a560: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
a570: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
a580: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
a590: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
a5a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a5b0: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
a5c0: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
a5d0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  r = sqlite3_mute
a5e0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
a5f0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
a600: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
a610: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
a620: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
a630: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
a640: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
a650: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
a660: 61 63 68 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b  acheList==pBt ){
a670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 68  .      sqlite3Sh
a680: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
a690: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
a6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
a6b0: 73 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72  st = sqlite3Shar
a6c0: 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20  edCacheList;.   
a6d0: 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20     while( pList 
a6e0: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
a6f0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
a700: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
a710: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a720: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
a730: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
a740: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
a750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a760: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
a770: 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
a780: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
a790: 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
a7a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
a7b0: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
a7c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a7d0: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
a7e0: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
a7f0: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
a800: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a810: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
a820: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
a830: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
a840: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
a850: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
a860: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
a870: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
a880: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
a890: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
a8a0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
a8b0: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
a8c0: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
a8d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a8e0: 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74 65  _held(p->pSqlite
a8f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
a900: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
a910: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
a920: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
a930: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
a940: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
a950: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
a960: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
a970: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
a980: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
a990: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a9a0: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
a9b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
a9c0: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
a9d0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
a9e0: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
a9f0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
aa00: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
aa10: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
aa20: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
aa30: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
aa40: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
aa50: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
aa60: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
aa70: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
aa80: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
aa90: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
aaa0: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
aab0: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
aac0: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
aad0: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
aae0: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
aaf0: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
ab00: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
ab10: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
ab20: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
ab30: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
ab40: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
ab50: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
ab60: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
ab70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
ab80: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
ab90: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
aba0: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
abb0: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
abc0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
abd0: 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
abe0: 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
abf0: 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
ac00: 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
ac10: 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
ac20: 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
ac30: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
ac40: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
ac50: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
ac60: 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
ac70: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ac80: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
ac90: 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
aca0: 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
acb0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
acc0: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
acd0: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
ace0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
acf0: 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
ad00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ad10: 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
ad20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
ad40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
ad50: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
ad60: 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
ad70: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
ad80: 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
ad90: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
ada0: 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
adb0: 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
adc0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
add0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
ade0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
adf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ae00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ae10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ae20: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
ae30: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
ae40: 74 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48  te3BtreeSetBusyH
ae50: 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c  andler(Btree *p,
ae60: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48   BusyHandler *pH
ae70: 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61  andler){.  BtSha
ae80: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ae90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
aea0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
aeb0: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  p->pSqlite->mute
aec0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
aed0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
aee0: 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
aef0: 72 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20  r = pHandler;.  
af00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
af10: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
af20: 70 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72  pPager, pHandler
af30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
af40: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
af50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
af60: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
af70: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
af80: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
af90: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
afa0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
afb0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
afc0: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
afd0: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
afe0: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
aff0: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b000: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b010: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b020: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
b030: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
b040: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
b050: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
b060: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
b070: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b080: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
b090: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
b0a0: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
b0b0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
b0c0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b0d0: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
b0e0: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
b0f0: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
b100: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
b110: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
b120: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
b130: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
b140: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
b150: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
b160: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
b170: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
b180: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
b190: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
b1a0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b1b0: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
b1c0: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
b1d0: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
b1e0: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
b1f0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
b200: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
b210: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
b220: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
b230: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
b240: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
b250: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b260: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b270: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b280: 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
b290: 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  e->mutex) );.  s
b2a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b2b0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
b2c0: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
b2d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
b2e0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
b2f0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
b300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
b320: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
b330: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
b340: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
b350: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
b360: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
b370: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
b380: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
b390: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
b3a0: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
b3b0: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
b3c0: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
b3d0: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
b3e0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
b3f0: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
b400: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b410: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
b420: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
b430: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
b440: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
b450: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
b460: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
b470: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
b480: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
b490: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
b4a0: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
b4b0: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
b4c0: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
b4d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b4e0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
b4f0: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
b500: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
b510: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
b520: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
b530: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
b540: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b550: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b560: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b570: 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
b580: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
b590: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
b5a0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
b5b0: 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
b5c0: 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
b5d0: 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
b5e0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b5f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b600: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
b610: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
b620: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
b630: 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
b640: 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
b650: 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
b660: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
b670: 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
b680: 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
b690: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
b6a0: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
b6b0: 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
b6c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b6d0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
b6e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
b6f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b700: 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74  (p->pSqlite->mut
b710: 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
b720: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
b730: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
b740: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
b750: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
b760: 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
b770: 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
b780: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b790: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b7a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b7b0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
b7c0: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
b7d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b7e0: 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
b7f0: 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
b800: 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
b810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b820: 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
b830: 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r page..**.** Th
b840: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
b850: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
b860: 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
b870: 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
b880: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
b890: 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
b8a0: 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
b8b0: 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
b8c0: 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
b8d0: 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
b8e0: 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
b8f0: 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
b900: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
b910: 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
b920: 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
b930: 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
b940: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
b950: 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
b960: 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
b970: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
b980: 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
b990: 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
b9a0: 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
b9b0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
b9c0: 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
b9d0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
b9e0: 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
b9f0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
ba00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
ba10: 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
ba20: 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
ba30: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
ba40: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
ba50: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
ba60: 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
ba70: 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
ba80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ba90: 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
baa0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bab0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bac0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
bad0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
bae0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
baf0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
bb00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb10: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
bb20: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
bb30: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
bb40: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
bb50: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
bb60: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
bb70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
bb80: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
bb90: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
bba0: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
bbb0: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
bbc0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
bbd0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
bbe0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
bbf0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
bc00: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
bc10: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
bc20: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
bc30: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
bc40: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
bc50: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
bc60: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
bc70: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
bc80: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
bc90: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
bca0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
bcb0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
bcc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bcd0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
bce0: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
bcf0: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
bd00: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
bd10: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
bd20: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
bd30: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
bd40: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
bd50: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
bd60: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
bd70: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
bd80: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
bd90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
bda0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bdb0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
bdc0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
bdd0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
bde0: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
bdf0: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
be00: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
be10: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
be20: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
be30: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
be40: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
be50: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
be60: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
be70: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
be80: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
be90: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
bea0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
beb0: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
bec0: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
bed0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
bee0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
bef0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
bf00: 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
bf10: 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
bf20: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
bf30: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
bf40: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
bf50: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
bf60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
bf70: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
bf80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf90: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
bfa0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
bfb0: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
bfc0: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
bfd0: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
bfe0: 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
bff0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
c000: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
c010: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
c020: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
c030: 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
c040: 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
c050: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
c060: 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
c070: 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
c080: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
c090: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
c0a0: 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
c0b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c0c0: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
c0d0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
c0e0: 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
c0f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c100: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
c110: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c120: 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
c130: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c140: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
c150: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61  LITE_OK;.  int a
c160: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f  v = (autoVacuum?
c170: 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  1:0);..  sqlite3
c180: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c190: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c1a0: 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d 70  zeFixed && av!=p
c1b0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
c1c0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
c1d0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
c1e0: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
c1f0: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20  toVacuum = av;. 
c200: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
c210: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c220: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c240: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c250: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
c260: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
c270: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
c280: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
c290: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
c2a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c2b0: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
c2c0: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
c2d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
c2e0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
c2f0: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
c300: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
c310: 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
c320: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c330: 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
c340: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
c350: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
c360: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
c370: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
c380: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c390: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
c3a0: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
c3b0: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
c3c0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c3d0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c3e0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
c3f0: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
c400: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
c410: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c420: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
c430: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
c440: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
c450: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
c460: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
c470: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
c480: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
c490: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
c4a0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
c4b0: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
c4c0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
c4d0: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
c4e0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
c4f0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
c500: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
c510: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
c520: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
c530: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
c540: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
c550: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
c560: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
c570: 72 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  rc, pageSize;.  
c580: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
c590: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c5a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c5b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c5c0: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
c5d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c5e0: 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OK;.  rc = sqlit
c5f0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
c600: 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
c610: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
c620: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c630: 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f   rc;.  ..  /* Do
c640: 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
c650: 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
c660: 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
c670: 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
c680: 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
c690: 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
c6a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
c6b0: 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  B;.  if( sqlite3
c6c0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
c6d0: 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 7b  Bt->pPager)>0 ){
c6e0: 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
c6f0: 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
c700: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
c710: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
c720: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
c730: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c740: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
c750: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
c760: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
c770: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
c780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c790: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
c7a0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
c7b0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
c7c0: 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
c7d0: 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
c7e0: 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
c7f0: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
c800: 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
c810: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
c820: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
c830: 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
c840: 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
c850: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c860: 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
c870: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
c880: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
c890: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
c8a0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
c8b0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c8c0: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
c8d0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
c8e0: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
c8f0: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
c900: 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
c910: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
c920: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
c930: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
c940: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
c950: 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
c960: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
c970: 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
c980: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
c990: 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
c9a0: 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
c9b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c9c0: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
c9d0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
c9e0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
c9f0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
ca00: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
ca10: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
ca20: 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
ca30: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
ca40: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
ca50: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
ca60: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
ca70: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
ca80: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
ca90: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
caa0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
cab0: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
cac0: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
cad0: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
cae0: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
caf0: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
cb00: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
cb10: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
cb20: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
cb30: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
cb40: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
cb50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
cb60: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
cb70: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
cb80: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
cb90: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
cba0: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
cbb0: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
cbc0: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
cbd0: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
cbe0: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
cbf0: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
cc00: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
cc10: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
cc20: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
cc30: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
cc40: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
cc50: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
cc60: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
cc70: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
cc80: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
cc90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
cca0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
ccb0: 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65  12)*pBt->maxEmbe
ccc0: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
ccd0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
cce0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
ccf0: 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45  ze-12)*pBt->minE
cd00: 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32  mbedFrac/255 - 2
cd10: 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
cd20: 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
cd30: 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
cd40: 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
cd50: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
cd60: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
cd70: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28  /255 - 23;.  if(
cd80: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70   pBt->minLocal>p
cd90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20  Bt->maxLocal || 
cda0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20  pBt->maxLocal<0 
cdb0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
cdc0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
cdd0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
cde0: 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
cdf0: 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
ce00: 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
ce10: 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
ce20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ce30: 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
ce40: 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
ce50: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
ce60: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
ce70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ce80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ce90: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
cea0: 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
ceb0: 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
cec0: 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
ced0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
cee0: 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
cef0: 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
cf00: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
cf10: 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
cf20: 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
cf30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
cf40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cf50: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
cf60: 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70  pRef) );.  if( p
cf70: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  Ref->inTrans==TR
cf80: 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
cf90: 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
cfa0: 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e   = pRef->pBt->in
cfb0: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
cfc0: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
cfd0: 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  pRef);.    rc = 
cfe0: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
cff0: 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b  nTrans(pRef, 0);
d000: 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e  .    pRef->pBt->
d010: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
d020: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
d030: 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73     pRef->inTrans
d040: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
d050: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52  E_OK ){.      pR
d070: 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61  ef->pBt->nTransa
d080: 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ction--;.    }. 
d090: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
d0a0: 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72  y(pRef);.  }.  r
d0b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20  eturn rc;.}.    
d0c0: 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68     ../*.** If th
d0d0: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
d0e0: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
d0f0: 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
d100: 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
d110: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
d120: 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
d130: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
d140: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
d150: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
d160: 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
d170: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
d180: 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
d190: 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
d1a0: 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
d1b0: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
d1c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
d1d0: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
d1e0: 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20  g cursors, this 
d1f0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
d200: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
d210: 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
d220: 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
d230: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d240: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
d250: 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
d260: 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
d270: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
d280: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d290: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d2a0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
d2b0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
d2c0: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
d2d0: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
d2e0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
d2f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
d300: 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
d310: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
d320: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
d330: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
d340: 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
d350: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
d360: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
d370: 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44         pPage->aD
d380: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
d390: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d3a0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
d3b0: 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
d3c0: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61  pBt;.        pPa
d3d0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ge->pgno = 1;.  
d3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
d3f0: 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
d400: 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
d410: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
d420: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
d430: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
d440: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
d450: 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
d460: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
d470: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
d480: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
d490: 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
d4a0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
d4b0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
d4c0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
d4d0: 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
d4e0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
d4f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d500: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d510: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d520: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
d530: 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74  >pPager)>0 ) ret
d540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d550: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
d560: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
d570: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
d580: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
d590: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d5a0: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
d5b0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
d5c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
d5d0: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
d5e0: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
d5f0: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
d600: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
d610: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
d620: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
d630: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
d640: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
d650: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
d660: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
d670: 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
d680: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
d690: 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
d6a0: 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d  21] = pBt->maxEm
d6b0: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
d6c0: 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d  22] = pBt->minEm
d6d0: 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
d6e0: 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  23] = pBt->minLe
d6f0: 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74  afFrac;.  memset
d700: 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
d710: 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
d720: 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
d730: 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
d740: 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
d750: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
d760: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
d770: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d780: 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
d790: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
d7a0: 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
d7b0: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
d7c0: 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
d7d0: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
d7e0: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
d7f0: 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
d800: 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
d810: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
d820: 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
d830: 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
d840: 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
d850: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
d860: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d870: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
d880: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
d890: 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
d8a0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
d8b0: 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
d8c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
d8d0: 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
d8e0: 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
d8f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
d900: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d910: 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
d920: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
d930: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
d940: 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
d950: 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
d960: 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
d970: 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
d990: 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
d9a0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
d9b0: 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
d9c0: 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
d9d0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
d9e0: 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
d9f0: 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
da00: 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
da10: 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
da20: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
da30: 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
da40: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
da50: 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
da60: 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
da70: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
da80: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
da90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
daa0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
dab0: 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
dac0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
dad0: 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
dae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
daf0: 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
db00: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
db10: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
db20: 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
db30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
db40: 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
db50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
db60: 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
db70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
db80: 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
db90: 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
dba0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
dbb0: 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
dbc0: 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
dbd0: 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
dbe0: 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
dbf0: 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
dc00: 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
dc10: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
dc20: 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
dc30: 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
dc40: 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
dc50: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
dc60: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
dc70: 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
dc80: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
dc90: 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
dca0: 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
dcb0: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
dcc0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
dcd0: 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
dce0: 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
dcf0: 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
dd00: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
dd10: 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
dd20: 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
dd30: 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
dd40: 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
dd50: 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
dd60: 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
dd70: 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
dd80: 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
dd90: 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
dda0: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
ddb0: 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
ddc0: 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
ddd0: 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
dde0: 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
ddf0: 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
de00: 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
de10: 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
de20: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
de30: 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
de40: 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
de50: 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
de60: 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
de70: 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
de80: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
de90: 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
dea0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
deb0: 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
dec0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
ded0: 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
dee0: 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
def0: 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
df00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
df10: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
df20: 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
df30: 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
df40: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
df50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
df60: 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
df70: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
df80: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
df90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
dfa0: 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
dfb0: 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
dfc0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
dfd0: 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
dfe0: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
dff0: 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
e000: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
e010: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
e020: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
e030: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
e040: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
e050: 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
e060: 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
e070: 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
e080: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
e090: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
e0a0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
e0b0: 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
e0c0: 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
e0d0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
e0e0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e0f0: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
e100: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
e110: 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
e120: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e130: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
e140: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
e150: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
e160: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
e170: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
e180: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
e190: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
e1a0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
e1b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
e1c0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e1e0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
e1f0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
e200: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
e210: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
e220: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
e230: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
e240: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 64  _begun;.  }..  d
e250: 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  o {.    if( pBt-
e260: 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
e270: 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
e280: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 0a  ee(pBt);.    }..
e290: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e2a0: 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
e2b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
e2c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
e2d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e2e0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
e2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e310: 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
e320: 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72  ge1->pDbPage, wr
e330: 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
e340: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e350: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
e360: 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
e370: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
e380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e390: 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
e3a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e3b0: 20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42   if( wrflag ) pB
e3c0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
e3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e3e0: 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
e3f0: 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
e400: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
e410: 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
e420: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
e430: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
e440: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e450: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
e460: 72 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64  r(pBt->pBusyHand
e470: 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  ler) );..  if( r
e480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e490: 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
e4a0: 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
e4b0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
e4c0: 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20  ansaction++;.   
e4d0: 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
e4e0: 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
e4f0: 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
e500: 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
e510: 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
e520: 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
e530: 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
e540: 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
e550: 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ans;.    }.  }..
e560: 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
e570: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
e580: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
e590: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
e5a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
e5b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e5c0: 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
e5d0: 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
e5e0: 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
e5f0: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
e600: 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
e610: 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
e620: 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
e630: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
e640: 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
e650: 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
e660: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
e670: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
e680: 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
e690: 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
e6a0: 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
e6b0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
e6c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6e0: 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
e6f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
e700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e720: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
e730: 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
e740: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e770: 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
e780: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
e790: 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  Bt;.  int isInit
e7a0: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
e7b0: 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
e7c0: 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
e7d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
e7e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e7f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e800: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
e810: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
e820: 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70  (pPage, pPage->p
e830: 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
e840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e850: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
e860: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
e870: 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
e880: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
e890: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
e8a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
e8b0: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
e8c0: 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
e8d0: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
e8e0: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
e8f0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ll);.    if( rc!
e900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e910: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
e920: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
e930: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
e940: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
e950: 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
e960: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
e970: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
e980: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
e990: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
e9a0: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
e9b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
e9c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e9d0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
e9e0: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
e9f0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
ea00: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
ea10: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
ea20: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
ea30: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
ea40: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
ea50: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
ea60: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
ea70: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
ea80: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
ea90: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
eaa0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
eab0: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
eac0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ead0: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
eae0: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
eaf0: 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
eb00: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
eb10: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
eb20: 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
eb30: 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
eb40: 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
eb50: 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
eb60: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
eb70: 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
eb80: 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
eb90: 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
eba0: 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
ebb0: 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
ebc0: 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
ebd0: 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
ebe0: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
ebf0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
ec00: 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
ec10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ec20: 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
ec30: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
ec40: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
ec50: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
ec60: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
ec70: 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
ec80: 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
ec90: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
eca0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
ecb0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
ecc0: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
ecd0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
ece0: 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
ecf0: 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
ed00: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
ed10: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ed30: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
ed40: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
ed50: 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
ed60: 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
ed70: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
ed80: 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
ed90: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
eda0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
edb0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
edc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
edd0: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
ede0: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
edf0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
ee00: 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
ee10: 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
ee20: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
ee30: 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
ee40: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
ee50: 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
ee60: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
ee70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ee80: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ee90: 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
eea0: 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
eeb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
eec0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
eed0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
eee0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
eef0: 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
ef00: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ef10: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
ef20: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
ef30: 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
ef40: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
ef50: 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
ef60: 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
ef70: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
ef80: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
ef90: 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
efa0: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
efb0: 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
efc0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
efd0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
efe0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
eff0: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
f000: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
f010: 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
f020: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
f030: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
f040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
f050: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
f060: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
f070: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
f080: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
f090: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
f0c0: 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
f0d0: 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
f0e0: 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
f0f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f100: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f110: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
f120: 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
f130: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
f140: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
f150: 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
f160: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
f170: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
f180: 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
f190: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f1a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f1b0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
f1c0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
f1d0: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
f1e0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
f1f0: 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
f200: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
f210: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
f220: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f230: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
f240: 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
f250: 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
f260: 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
f270: 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
f280: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
f290: 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
f2a0: 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
f2b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f2c0: 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
f2d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
f2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
f2f0: 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
f300: 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
f310: 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
f320: 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
f330: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
f340: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
f350: 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
f360: 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
f370: 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
f380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
f390: 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
f3a0: 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
f3b0: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
f3c0: 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20  FreePage        
f3d0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
f3e0: 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
f3f0: 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ge to */.){.  Me
f400: 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
f410: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
f420: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
f430: 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
f440: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
f450: 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
f460: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
f470: 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
f480: 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
f490: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
f4a0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
f4b0: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
f4c0: 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
f4d0: 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
f4e0: 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
f4f0: 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
f500: 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
f510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f520: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
f540: 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
f550: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
f560: 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
f570: 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  t's current loca
f580: 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
f590: 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
f5a0: 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
f5b0: 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
f5c0: 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
f5d0: 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
f5e0: 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
f5f0: 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
f600: 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
f610: 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
f620: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
f630: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
f640: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
f650: 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28  FreePage);.  if(
f660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f680: 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
f690: 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
f6a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
f6b0: 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
f6c0: 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
f6d0: 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
f6e0: 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
f6f0: 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
f700: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
f710: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
f720: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
f730: 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
f740: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
f750: 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
f760: 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
f770: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
f780: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
f790: 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
f7a0: 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
f7b0: 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
f7c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
f7d0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f7e0: 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
f7f0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
f800: 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
f810: 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
f820: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
f830: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
f840: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
f850: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
f860: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
f870: 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
f880: 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
f890: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
f8a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f8b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f8c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
f8d0: 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
f8e0: 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
f8f0: 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
f900: 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
f910: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
f920: 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
f930: 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
f940: 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
f950: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
f960: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f970: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
f980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f990: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
f9a0: 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
f9b0: 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
f9c0: 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
f9d0: 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
f9e0: 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
f9f0: 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
fa00: 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
fa10: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
fa20: 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
fa30: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
fa40: 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
fa50: 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
fa60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
fa70: 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
fa80: 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
fa90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
faa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fab0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fac0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
fad0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
fae0: 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
faf0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
fb00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fb10: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
fb20: 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
fb30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
fb40: 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
fb50: 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
fb60: 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
fb70: 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
fb80: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
fb90: 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
fba0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fbb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
fbc0: 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
fbd0: 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
fbe0: 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
fbf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fc00: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
fc10: 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
fc20: 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
fc30: 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
fc40: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
fc50: 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
fc60: 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
fc70: 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
fc80: 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
fc90: 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
fca0: 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
fcb0: 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
fcc0: 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
fcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
fce0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
fcf0: 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
fd00: 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
fd10: 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
fd20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
fd30: 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
fd40: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
fd50: 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
fd60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
fd70: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
fd80: 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
fd90: 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
fda0: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
fdb0: 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
fdc0: 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
fdd0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
fde0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
fdf0: 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
fe00: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
fe10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
fe20: 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
fe30: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
fe40: 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
fe50: 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
fe60: 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
fe70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
fe80: 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
fe90: 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
fea0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
feb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
fec0: 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
fed0: 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
fee0: 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
fef0: 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
ff00: 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
ff10: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
ff20: 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50   Pgno nFin){.  P
ff30: 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20  gno iLastPg;    
ff40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
ff50: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
ff60: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
ff70: 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
ff80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ff90: 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
ffa0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
ffb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
ffc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ffd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ffe0: 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e   iLastPg = pBt->
fff0: 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c  nTrunc;.  if( iL
10000 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  astPg==0 ){.    
10010 69 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74 65  iLastPg = sqlite
10020 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10030 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10040 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
10050 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
10060 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
10070 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
10080 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
10090 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
100a0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
100b0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
100c0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
100d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
100e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
100f0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
10100 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
10110 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
10120 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10130 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
10140 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
10150 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
10160 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
10170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10180 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10190 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
101a0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
101b0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
101c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
101d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
101e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
101f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
10200 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
10210 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
10220 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
10230 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
10240 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
10250 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
10260 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
10270 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
10280 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
10290 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
102a0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
102b0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
102c0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
102d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
102e0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
102f0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
10300 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
10310 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
10320 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
10330 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
10340 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
10350 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
10360 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
10370 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
10380 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
10390 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
103a0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
103b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
103c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
103d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
103e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
103f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
10400 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
10410 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
10420 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
10430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
10440 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
10450 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
10460 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10470 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
10480 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
10490 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
104a0 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
104b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
104c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
104d0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
104e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
104f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10510 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
10520 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
10530 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
10540 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
10550 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
10560 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
10570 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
10580 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
10590 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
105a0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
105b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
105c0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
105d0 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
105e0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
105f0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
10600 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
10610 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
10620 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
10630 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
10640 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
10650 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
10660 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
10670 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
10680 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
10690 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
106a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
106b0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
106c0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
106d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
106e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
106f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
10700 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
10710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
10730 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
10740 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
10750 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
10760 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
10770 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10780 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
10790 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
107a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
107b0 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
107c0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
107d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
107e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
107f0 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20  c;.      } .    
10800 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
10810 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
10820 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
10830 65 2c 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20  e, iFreePg);.   
10840 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10850 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
10860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10870 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10880 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a  rn rc;.      } .
10890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74      }.  }..  pBt
108a0 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74  ->nTrunc = iLast
108b0 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  Pg - 1;.  while(
108c0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45   pBt->nTrunc==PE
108d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
108e0 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
108f0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54  AGE(pBt, pBt->nT
10900 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74  runc) ){.    pBt
10910 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a  ->nTrunc--;.  }.
10920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10930 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
10940 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10950 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
10960 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
10970 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
10980 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
10990 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
109a0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
109b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
109c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
109d0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
109e0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
109f0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
10a00 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
10a10 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
10a20 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
10a30 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
10a40 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
10a50 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
10a60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
10a70 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
10a80 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
10a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10aa0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
10ab0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
10ac0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
10ad0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
10ae0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10af0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
10b00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10b10 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
10b20 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
10b30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
10b40 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
10b50 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
10b60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
10b70 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
10b80 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
10b90 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
10ba0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
10bb0 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a  ep(pBt, 0);.  }.
10bc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10bd0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10c00 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
10c10 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
10c20 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
10c30 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
10c40 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
10c50 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
10c60 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
10c70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
10c80 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
10c90 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
10ca0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
10cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10cc0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
10cd0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
10ce0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
10cf0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
10d00 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
10d10 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
10d20 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
10d30 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
10d40 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
10d50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10d60 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
10d70 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
10d80 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b   Pgno *pnTrunc){
10d90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10da0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
10db0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
10dc0 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ager;.#ifndef ND
10dd0 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
10de0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
10df0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
10e00 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
10e10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10e20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10e30 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
10e40 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
10e50 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
10e60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
10e70 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
10e80 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
10e90 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
10ea0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
10eb0 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
10ec0 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
10ed0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
10ee0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
10ef0 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
10f00 53 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Size;.      Pgno
10f10 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33   nOrig = sqlite3
10f20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
10f30 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
10f40 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
10f50 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
10f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10f70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10f80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
10f90 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
10fa0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
10fb0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
10fc0 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
10fd0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
10fe0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
10ff0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11000 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
11010 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
11020 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
11030 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
11040 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
11050 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
11060 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
11070 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
11080 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
11090 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
110a0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
110b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
110c0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
110d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
110e0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
110f0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
11100 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
11110 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11120 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
11130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11140 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
11150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11160 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
11170 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
11180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11190 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
111a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
111b0 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
111c0 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
111d0 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
111e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
111f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
11200 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
11210 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11220 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
11230 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
11240 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
11250 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
11260 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
11270 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
11280 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11290 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
112a0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  .        pBt->nT
112b0 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  runc = nFin;.   
112c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
112d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
112e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
112f0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
11300 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
11310 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
11320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
11330 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54  nTrunc = pBt->nT
11340 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  runc;.    pBt->n
11350 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunc = 0;.  }. 
11360 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
11370 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
11380 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
11390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
113a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
113b0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
113c0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
113d0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
113e0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
113f0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
11400 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11410 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
11420 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
11430 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
11440 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
11450 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
11460 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
11470 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
11480 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
11490 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
114a0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
114b0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
114c0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
114d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
114e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
114f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
11500 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
11510 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
11520 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
11530 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
11540 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
11550 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
11560 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
11570 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
11580 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
11590 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
115a0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
115b0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
115c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
115d0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
115e0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
115f0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
11600 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
11610 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11620 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
11630 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
11640 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
11650 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
11660 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
11670 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
11680 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
11690 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
116a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
116b0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
116c0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
116d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
116e0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
116f0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
11700 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
11710 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
11720 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
11730 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11740 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
11750 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
11760 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
11770 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
11780 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
11790 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
117a0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
117b0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
117c0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
117d0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
117e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
117f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
11800 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
11810 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
11820 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
11830 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
11840 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
11850 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
11860 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
11870 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
11880 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
11890 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
118a0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
118b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
118c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
118d0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
118e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
118f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11900 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11910 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
11920 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
11930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11940 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
11950 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
11960 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
11970 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11980 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
11990 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nc = 0;.    sqli
119a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
119b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
119c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
119d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
119e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
119f0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
11a00 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54  mCommit(pBt, &nT
11a10 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66  runc); .      if
11a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11a30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11a40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11a50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11a60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11a70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
11a80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
11a90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
11aa0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
11ab0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
11ac0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ad0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
11ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11af0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
11b00 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
11b10 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
11b20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11b30 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
11b40 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
11b50 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
11b60 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
11b70 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
11b80 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
11b90 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
11ba0 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a  ould be invoked.
11bb0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
11bc0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
11bd0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
11be0 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
11bf0 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65  e did.** all the
11c00 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
11c10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
11c20 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
11c30 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
11c40 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
11c50 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
11c60 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
11c70 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
11c80 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
11c90 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
11ca0 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72  r truncate the r
11cb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
11cc0 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73  ** (which causes
11cd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11ce0 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20   to commit) and 
11cf0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
11d00 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
11d10 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
11d20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
11d30 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
11d40 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
11d50 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
11d60 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
11d70 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
11d80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11d90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
11da0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
11db0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11dc0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
11dd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
11de0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
11e00 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
11e10 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
11e20 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
11e30 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
11e40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
11e50 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
11e60 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
11e70 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
11e80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11e90 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
11ea0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
11eb0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
11ec0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11ed0 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
11ee0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
11ef0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
11f00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11f10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
11f20 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11f50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11f60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
11f70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
11f80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
11f90 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
11fa0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
11fb0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
11fc0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
11fd0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
11fe0 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
11ff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
12000 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
12010 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
12020 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
12030 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
12040 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12050 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
12060 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
12070 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
12080 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
12090 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
120a0 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
120b0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
120c0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
120d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
120e0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
120f0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
12100 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
12110 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
12120 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
12130 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12140 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
12150 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12160 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
12170 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
12180 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
12190 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
121a0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
121b0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
121c0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
121d0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
121e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
121f0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
12200 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
12210 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
12220 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
12230 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
12240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
12260 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12270 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
12280 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
12290 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
122a0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
122b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
122c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
122d0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
122e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
122f0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
12300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12320 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12330 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a  haseTwo(p);.  }.
12340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12350 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12360 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
12370 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
12380 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
12390 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  f write-cursors 
123a0 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e  open on this han
123b0 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72  dle. This is for
123c0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
123d0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
123e0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
123f0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
12400 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
12410 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ned..**.** For t
12420 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
12430 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77  his routine, a w
12440 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61  rite-cursor is a
12450 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
12460 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
12470 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
12480 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65  atabse.  That me
12490 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77  ans the cursor w
124a0 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79  as.** originally
124b0 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
124c0 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73  ing and the curs
124d0 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69  or has not be di
124e0 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76  sabled.** by hav
124f0 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68  ing its state ch
12500 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f  anged to CURSOR_
12510 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  FAULT..*/.static
12520 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
12530 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
12540 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
12550 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
12560 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
12570 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
12580 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
12590 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
125a0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
125b0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
125c0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
125d0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
125e0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
125f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12600 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
12610 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
12620 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
12630 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
12640 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
12650 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61   on BtShared tha
12660 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
12670 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76  rences..**.** Ev
12680 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72  ery cursor is tr
12690 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
126a0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65   cursors that be
126b0 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72  long.** to other
126c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
126d0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
126e0 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a  n to be sharing.
126f0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ** the cache wit
12700 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
12710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
12720 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
12730 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
12740 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
12750 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
12760 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69  ache must be tri
12770 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65  pped.** to preve
12780 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79  nt them from try
12790 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62  ing to use the b
127a0 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  tree after.** th
127b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  e rollback.  The
127c0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
127d0 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  ve deleted table
127e0 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f  s.** or moved ro
127f0 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20  ot pages, so it 
12800 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
12810 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65  t to.** save the
12820 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
12830 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  rsor.  The curso
12840 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  r must be.** inv
12850 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  alidated..*/.voi
12860 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d sqlite3BtreeTr
12870 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
12880 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
12890 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75  errCode){.  BtCu
128a0 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74  rsor *p;.  sqlit
128b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
128c0 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
128d0 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
128e0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
128f0 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72  t){.    clearCur
12900 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
12910 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
12920 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
12930 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
12940 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ode;.  }.  sqlit
12950 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
12960 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
12970 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
12980 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
12990 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
129a0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
129b0 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
129c0 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
129d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
129e0 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
129f0 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
12a00 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
12a10 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
12a20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
12a30 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
12a40 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
12a50 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
12a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12a70 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
12a80 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
12a90 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
12aa0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
12ab0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
12ac0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
12ad0 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
12ae0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
12af0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12b00 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
12b10 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
12b20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12b30 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
12b40 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
12b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12b60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
12b70 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
12b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
12b90 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
12ba0 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
12bb0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
12bc0 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
12bd0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
12be0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
12bf0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
12c00 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
12c10 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
12c20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
12c30 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
12c40 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
12c50 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
12c60 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
12c70 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
12c80 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
12c90 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
12ca0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
12cb0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
12cc0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
12cd0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
12ce0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
12cf0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
12d00 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
12d10 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
12d20 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
12d30 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
12d40 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
12d50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
12d60 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
12d70 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
12d80 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
12d90 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
12da0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
12db0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12dc0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
12dd0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23  .    int rc2;..#
12de0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12df0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12e00 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
12e10 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61  0;.#endif..    a
12e20 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
12e30 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
12e40 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
12e50 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
12e60 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
12e70 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
12e80 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
12e90 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
12ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
12eb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
12ec0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
12ed0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
12ee0 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
12ef0 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  ** call sqlite3B
12f00 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
12f10 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
12f20 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
12f30 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
12f40 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
12f50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
12f60 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
12f70 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
12f80 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
12f90 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
12fa0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
12fb0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
12fc0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
12fd0 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
12fe0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12ff0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
13000 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
13010 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13020 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
13030 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
13040 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
13050 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
13060 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
13070 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
13080 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
13090 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
130a0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
130b0 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    }..  p->inTran
130c0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
130d0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
130e0 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
130f0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
13100 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
13110 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
13120 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13140 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
13150 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
13160 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
13170 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
13180 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
13190 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
131a0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
131b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
131c0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
131d0 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
131e0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
131f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
13200 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
13210 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
13220 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
13230 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
13240 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
13250 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
13260 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
13270 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
13280 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
13290 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
132a0 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
132b0 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
132c0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
132d0 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
132e0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
132f0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
13300 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
13310 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
13320 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
13330 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
13340 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
13350 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
13360 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
13370 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
13380 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
13390 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
133a0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
133b0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
133c0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
133d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
133e0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
133f0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
13400 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
13410 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
13420 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
13430 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
13440 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
13450 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13460 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
13470 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13480 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
13490 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
134a0 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
134b0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
134c0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
134d0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
134e0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
134f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13500 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
13510 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
13520 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
13530 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Only ? SQLITE_OK
13540 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   : sqlite3PagerS
13550 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  tmtBegin(pBt->pP
13560 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
13570 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
13580 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13590 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
135a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
135b0 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65  ommit the statme
135c0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
135d0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
135e0 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a  rogress.  If no.
135f0 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ** subtransactio
13600 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69  n is active, thi
13610 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  s is a no-op..*/
13620 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13630 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65  eCommitStmt(Btre
13640 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13650 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13660 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
13670 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13680 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
13690 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
136a0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
136b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
136c0 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70  tmtCommit(pBt->p
136d0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
136e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
136f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  _OK;.  }.  pBt->
13700 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71  inStmt = 0;.  sq
13710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13720 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
13740 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74  ck the active st
13750 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
13760 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73  action.  If no s
13770 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  ubtransaction.**
13780 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20   is active this 
13790 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
137a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75  op..**.** All cu
137b0 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
137c0 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
137d0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
137e0 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  y attempt.** to 
137f0 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61  use a cursor tha
13800 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
13810 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
13820 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
13830 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
13840 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
13850 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
13860 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20  lbackStmt(Btree 
13870 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
13880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
13890 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
138a0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
138b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
138c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61  qlite3MallocDisa
138d0 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28 20 70 42  llow();.  if( pB
138e0 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
138f0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
13900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13910 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
13920 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
13930 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13940 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13950 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13960 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
13970 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  .  sqlite3Malloc
13980 41 6c 6c 6f 77 28 29 3b 0a 20 20 73 71 6c 69 74  Allow();.  sqlit
13990 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
139a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
139b0 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b  ./*.** Default k
139c0 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey comparison fu
139d0 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65  nction to be use
139e0 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73  d if no comparis
139f0 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  on function.** i
13a00 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  s specified on t
13a10 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
13a20 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f  ursor() call..*/
13a30 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66 6c 74  .static int dflt
13a40 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
13a50 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  *NotUsed,       
13a60 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
13a70 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64 20 2a  ta is not used *
13a80 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73  /.  int n1, cons
13a90 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f  t void *p1,    /
13aa0 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 63  * First key to c
13ab0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
13ac0 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n2, const void *
13ad0 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  p2     /* Second
13ae0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
13af0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  */.){.  int c;. 
13b00 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20   c = memcmp(p1, 
13b10 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a  p2, n1<n2 ? n1 :
13b20 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30   n2);.  if( c==0
13b30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
13b40 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
13b50 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n c;.}../*.** Cr
13b60 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
13b70 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
13b80 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
13b90 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
13ba0 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
13bb0 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
13bc0 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
13bd0 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
13be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
13bf0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
13c00 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
13c10 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
13c20 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
13c30 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
13c40 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
13c50 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
13c60 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
13c70 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
13c80 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
13c90 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
13ca0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
13cb0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
13cc0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
13cd0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
13ce0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
13cf0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
13d00 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
13d10 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
13d20 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
13d30 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
13d40 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
13d50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
13d60 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
13d70 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
13d80 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
13d90 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
13da0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
13db0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
13dc0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
13dd0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
13de0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
13df0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
13e00 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
13e10 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
13e20 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
13e30 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
13e40 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
13e50 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
13e60 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
13e70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
13e80 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
13e90 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
13ea0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
13eb0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
13ec0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
13ed0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
13ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
13ef0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
13f00 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
13f10 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
13f20 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
13f30 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
13f40 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
13f50 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
13f60 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
13f70 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
13f80 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
13f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70  ..**.** The comp
13fa0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
13fb0 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c  must be logicall
13fc0 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 65  y the same for e
13fd0 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f  very cursor.** o
13fe0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
13ff0 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e 67 20  able.  Changing 
14000 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
14010 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
14020 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72  ult.** in incorr
14030 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ect operations. 
14040 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   If the comparis
14050 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  on function is N
14060 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c  ULL, a.** defaul
14070 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  t comparison fun
14080 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ction is used.  
14090 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
140a0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c  unction is.** al
140b0 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  ways ignored for
140c0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a   INTKEY tables..
140d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
140e0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
140f0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14120 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
14130 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
14160 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
14170 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
14180 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
141b0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
141c0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70   */.  int (*xCmp
141d0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
141e0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
141f0 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79  t void*), /* Key
14200 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   Comparison func
14210 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
14220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
14250 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
14260 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43    BtCursor **ppC
14270 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14290 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
142a0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
142b0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
142c0 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61  r *pCur;.  BtSha
142d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
142e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
142f0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
14300 75 74 65 78 28 70 29 20 29 3b 0a 20 20 2a 70 70  utex(p) );.  *pp
14310 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77  Cur = 0;.  if( w
14320 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28  rFlag ){.    if(
14330 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
14340 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14350 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
14360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
14370 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
14380 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
14390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
143a0 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  E_LOCKED;.    }.
143b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e    }..  if( pBt->
143c0 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
143d0 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57   rc = lockBtreeW
143e0 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20  ithRetry(p);.   
143f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14410 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14420 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
14430 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a  ly && wrFlag ){.
14440 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14450 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
14460 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d    }.  }.  pCur =
14470 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
14480 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  ro( sizeof(*pCur
14490 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
144a0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
144b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
144c0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
144d0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
144e0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
144f0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
14500 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  le;.  if( iTable
14510 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50 61  ==1 && sqlite3Pa
14520 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14530 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
14540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14550 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
14560 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
14570 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
14580 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
14590 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
145a0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
145b0 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
145c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
145d0 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
145e0 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
145f0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
14600 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
14610 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
14620 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
14630 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
14640 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
14650 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
14660 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
14670 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
14680 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
14690 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
146a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
146b0 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
146c0 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20  xCompare = xCmp 
146d0 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d  ? xCmp : dfltCom
146e0 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41  pare;.  pCur->pA
146f0 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43 75  rg = pArg;.  pCu
14700 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
14710 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
14720 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
14730 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
14740 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
14750 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
14760 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
14770 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
14780 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
14790 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
147a0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
147b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
147c0 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75  INVALID;.  *ppCu
147d0 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74  r = pCur;..  ret
147e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
147f0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
14800 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70  ception:.  if( p
14810 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Cur ){.    relea
14820 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
14830 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
14840 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d  _free(pCur);.  }
14850 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14860 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
14870 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
14880 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
14890 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
148d0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
14910 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
14920 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14950 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
14960 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
14970 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
14980 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
14990 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
149a0 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
149b0 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
149c0 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
149f0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
14a00 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
14a10 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14a40 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
14a50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
14a60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14a70 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
14a80 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
14a90 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 78 43  able, wrFlag, xC
14aa0 6d 70 2c 20 70 41 72 67 2c 20 70 70 43 75 72 29  mp, pArg, ppCur)
14ab0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14ac0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
14ae0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
14af0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
14b00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14b10 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
14b20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
14b30 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
14b40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14b50 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
14b60 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
14b70 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
14b80 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
14b90 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
14ba0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
14bb0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
14bc0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
14bd0 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
14be0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
14bf0 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
14c00 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76  .    pCur->pPrev
14c10 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
14c20 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
14c30 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
14c40 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
14c50 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
14c60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
14c70 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
14c80 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
14c90 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
14ca0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
14cb0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
14cc0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76  used(pBt);.  inv
14cd0 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
14ce0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 73 71  ache(pCur);.  sq
14cf0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
14d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14d10 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
14d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14d30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
14d40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
14d50 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69  sor by filling i
14d60 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  n the fields of 
14d70 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65  pTempCur..** The
14d80 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
14d90 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  r is not on the 
14da0 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20  cursor list for 
14db0 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f  the Btree..*/.vo
14dc0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  id sqlite3BtreeG
14dd0 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  etTempCursor(BtC
14de0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43  ursor *pCur, BtC
14df0 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29  ursor *pTempCur)
14e00 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
14e10 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
14e20 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  r) );.  memcpy(p
14e30 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73  TempCur, pCur, s
14e40 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20  izeof(*pCur));. 
14e50 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
14e60 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
14e70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69  ->pPrev = 0;.  i
14e80 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  f( pTempCur->pPa
14e90 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ge ){.    sqlite
14ea0 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43  3PagerRef(pTempC
14eb0 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61  ur->pPage->pDbPa
14ec0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
14ed0 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
14ee0 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
14ef0 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
14f00 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
14f10 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
14f20 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
14f30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
14f40 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
14f50 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
14f60 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
14f70 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
14f80 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
14f90 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
14fa0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
14fb0 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65  nref(pCur->pPage
14fc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
14fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14fe0 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
14ff0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
15000 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
15010 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
15020 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
15030 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
15040 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
15050 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
15060 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
15070 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
15080 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
15090 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
150a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
150b0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
150c0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
150d0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
150e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
150f0 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
15100 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
15110 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
15120 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
15130 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
15140 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
15150 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
15160 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
15170 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
15180 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
15190 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
151a0 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
151b0 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
151c0 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
151d0 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
151e0 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
151f0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
15200 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
15210 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
15220 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
15230 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
15240 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
15250 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
15260 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
15270 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
15280 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
15290 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
152a0 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
152b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
152c0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
152d0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
152e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
152f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
15300 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
15310 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
15320 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
15330 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
15340 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
15350 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  ->idx, &info);. 
15360 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
15370 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
15380 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
15390 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
153a0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
153b0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
153c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
153d0 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
153e0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
153f0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
15400 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
15410 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
15420 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
15430 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
15440 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
15450 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
15460 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
15470 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15480 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
15490 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
154a0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
154b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
154c0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
154d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
154e0 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
154f0 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
15500 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
15510 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
15520 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
15530 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
15540 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
15550 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15590 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
155a0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
155e0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
155f0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
15600 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72  pCur->idx, &pCur
15610 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
15620 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
15670 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15680 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
156c0 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
156d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
156e0 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
156f0 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
15700 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
15710 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
15720 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
15730 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
15740 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
15750 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
15760 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
15770 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15780 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
15790 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
157a0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
157b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
157c0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
157d0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
157e0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
157f0 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
15800 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
15810 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
15820 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
15830 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
15840 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15850 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15860 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
15870 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
15880 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
15890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
158a0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
158b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
158c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
158d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
158e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
158f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
15900 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
15910 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  LID ){.      *pS
15920 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
15930 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
15940 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
15950 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
15960 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
15970 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15980 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
15990 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
159a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
159b0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
159c0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
159d0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
159e0 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72  ts to.  Always r
159f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
15a00 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
15a10 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66  ot possible.  If
15a20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
15a30 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ot currently.** 
15a40 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65  pointing to an e
15a50 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20  ntry (which can 
15a60 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
15a70 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64  ple, if.** the d
15a80 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
15a90 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73  ) then *pSize is
15aa0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e   set to 0..*/.in
15ab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
15ac0 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
15ad0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
15ae0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
15af0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15b00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15b10 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
15b20 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
15b30 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
15b40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15b50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
15b60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
15b70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
15b80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
15b90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
15ba0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
15bb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
15bc0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
15bd0 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
15be0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
15bf0 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
15c00 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
15c10 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
15c20 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
15c30 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
15c40 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
15c50 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
15c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
15c80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15c90 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
15ca0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
15cb0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
15cc0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
15cd0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
15ce0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
15cf0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15d00 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
15d10 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
15d20 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
15d30 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
15d40 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
15d50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
15d60 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
15d70 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
15d80 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
15d90 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
15da0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15db0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
15dc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15dd0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
15de0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e  *.** Unless pPgn
15df0 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
15e00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15e10 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
15e20 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20  low .** page in 
15e30 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
15e40 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
15e50 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
15e60 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65  e ovfl.** is the
15e70 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
15e80 27 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20  's linked list, 
15e90 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
15ea0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
15eb0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
15ec0 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65  ot NULL, *ppPage
15ed0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d   is set to the M
15ee0 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a  emPage* handle.*
15ef0 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e  * for page ovfl.
15f00 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
15f10 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68  pager page may h
15f20 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
15f30 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e  ed.** with the n
15f40 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65  oContent flag se
15f50 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64  t, so the page d
15f60 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76  ata accessable v
15f70 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  ia.** this handl
15f80 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75  e may not be tru
15f90 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
15fa0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
15fb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
15fc0 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76  *pBt, .  Pgno ov
15fd0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
15fe0 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f        /* Overflo
15ff0 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  w page */.  MemP
16000 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
16010 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16020 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
16030 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
16040 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
16050 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
16060 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
16070 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
16080 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74   next = 0;.  int
16090 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
160a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
160b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
160c0 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;.  /* One of th
160d0 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ese must not be 
160e0 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
160f0 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66   why call this f
16100 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73  unction? */.  as
16110 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70  sert(ppPage || p
16120 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a  PgnoNext);..  /*
16130 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73   If pPgnoNext is
16140 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
16150 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
16160 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  ng called to obt
16170 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61  ain.  ** a MemPa
16180 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  ge* reference on
16190 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61  ly. No page-data
161a0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
161b0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  this case..  */.
161c0 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74    if( !pPgnoNext
161d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
161e0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
161f0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70  ge(pBt, ovfl, pp
16200 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23  Page, 1);.  }..#
16210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16220 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16230 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
16240 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
16250 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
16260 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
16270 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
16280 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
16290 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
162a0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
162b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
162c0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
162d0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
162e0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
162f0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
16300 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
16310 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
16320 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
16330 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
16340 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16350 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
16360 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
16370 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
16380 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
16390 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
163a0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
163b0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
163c0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
163d0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
163e0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
163f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16400 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
16410 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
16420 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74 65  ( iGuess<=sqlite
16430 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
16440 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
16450 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
16460 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
16470 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
16480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
164b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
164c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
164d0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
164e0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
164f0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
16500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16510 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
16520 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50  ( next==0 || ppP
16530 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  age ){.    MemPa
16540 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
16550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16560 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
16570 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
16580 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73  next!=0);.    as
16590 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
165a0 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b  OK || pPage==0);
165b0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  .    if( next==0
165c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
165d0 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
165e0 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
165f0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
16600 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20  .    if( ppPage 
16610 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
16620 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65   = pPage;.    }e
16630 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  lse{.      relea
16640 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
16650 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e     }.  }.  *pPgn
16660 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20  oNext = next;.. 
16670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16680 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
16690 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
166a0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
166b0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
166c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
166d0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
166e0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
166f0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16700 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
16710 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
16720 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
16730 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
16740 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
16750 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
16760 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
16770 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
16780 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
16790 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
167a0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
167b0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
167c0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
167d0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
167e0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
167f0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
16800 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
16810 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16820 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
16830 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
16840 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
16850 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
16860 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
16870 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
16880 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
16890 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
168a0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
168b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
168c0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
168d0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
168e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
168f0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
16900 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
16910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16920 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
16930 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
16940 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
16950 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
16960 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
16970 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
16980 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
16990 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
169a0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
169b0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
169c0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
169d0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
169e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
169f0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
16a00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16a30 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
16a40 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
16a50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16a60 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
16a70 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
16a80 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
16a90 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
16aa0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
16ab0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
16ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16ae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
16af0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
16b00 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
16b10 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
16b20 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
16b30 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
16b40 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
16b50 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
16b60 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
16b70 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
16b80 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
16b90 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
16ba0 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
16bb0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
16bc0 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
16bd0 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
16be0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
16bf0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
16c00 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
16c10 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
16c20 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
16c30 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
16c40 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
16c50 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
16c60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
16c70 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
16c80 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
16c90 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
16ca0 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
16cb0 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
16cc0 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
16cd0 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
16ce0 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
16cf0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
16d00 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
16d10 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
16d20 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
16d30 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
16d40 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
16d50 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
16d60 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
16d70 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
16d80 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
16d90 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
16da0 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
16db0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
16dc0 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
16dd0 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
16de0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
16df0 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
16e00 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
16e10 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
16e20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
16e30 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
16e40 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
16e50 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
16e60 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
16e70 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
16e80 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
16e90 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
16ea0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
16eb0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
16ec0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
16ed0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
16ee0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
16ef0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
16f00 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
16f10 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
16f20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
16f30 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
16f40 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
16f50 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
16f60 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
16f70 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
16f80 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
16f90 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
16fa0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
16fb0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
16fc0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
16fd0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
16fe0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
16ff0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
17000 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
17010 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
17020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17030 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
17040 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
17050 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17060 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
17070 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
17080 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  /.  int offset, 
17090 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
170a0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
170b0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
170c0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
170d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
170e0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
170f0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
17100 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
17110 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
17120 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
17130 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
17140 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
17150 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
17160 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
17170 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17190 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
171a0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
171b0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
171c0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
171d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
171e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
171f0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
17200 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
17210 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
17220 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  age;     /* Btre
17230 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
17240 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a  t cursor entry *
17250 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
17260 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
17270 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
17280 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
17290 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
172a0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
172b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
172c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
172d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
172e0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
172f0 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
17300 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
17310 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
17320 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
17330 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
17340 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
17350 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
17360 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
17370 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
17380 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
17390 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
173a0 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72  ntKey ? 0 : pCur
173b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
173c0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
173d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
173e0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
173f0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
17400 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
17410 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
17420 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
17430 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
17440 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
17450 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
17460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17470 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  OR;.  }..  /* Ch
17480 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
17490 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
174a0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
174b0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
174c0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
174d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
174e0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
174f0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
17500 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
17510 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
17520 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
17530 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
17540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
17550 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
17560 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
17570 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
17580 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
17590 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
175a0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
175b0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
175c0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
175d0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
175e0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
175f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17600 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
17610 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a  onst int ovflSiz
17620 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
17630 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
17640 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
17650 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
17660 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
17670 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
17680 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
17690 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
176a0 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
176b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
176c0 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
176d0 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
176e0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
176f0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
17700 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
17710 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
17720 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
17730 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
17740 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
17750 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
17760 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
17770 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
17780 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
17790 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
177a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
177b0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
177c0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
177d0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
177e0 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
177f0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
17800 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
17810 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
17820 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
17830 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
17840 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
17850 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
17860 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
17870 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
17880 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
17890 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
178a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
178b0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
178c0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
178d0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
178e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
178f0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
17900 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
17910 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
17920 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
17930 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
17940 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
17950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
17960 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
17970 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
17980 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17990 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
179a0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
179b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
179c0 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
179d0 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
179e0 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
179f0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
17a00 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
17a10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
17a20 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
17a30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
17a40 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
17a50 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
17a60 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
17a70 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
17a80 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
17a90 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
17aa0 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
17ab0 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
17ac0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
17ad0 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
17ae0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
17af0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
17b00 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
17b10 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
17b20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
17b30 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
17b40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17b50 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
17b60 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
17b70 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
17b80 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
17b90 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
17ba0 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
17bb0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
17bc0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
17bd0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
17be0 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
17bf0 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
17c00 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
17c10 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
17c20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
17c30 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
17c40 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
17c50 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
17c60 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
17c70 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
17c80 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
17c90 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
17ca0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
17cb0 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
17cc0 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
17cd0 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
17ce0 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
17cf0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
17d00 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
17d10 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
17d20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
17d30 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
17d40 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
17d50 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
17d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
17d70 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
17d80 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
17d90 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
17da0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
17db0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
17dc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
17dd0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
17de0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
17df0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
17e00 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
17e10 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
17e20 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
17e30 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
17e40 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
17e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17e60 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
17e70 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
17e80 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
17e90 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
17ea0 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
17eb0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
17ec0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
17ed0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
17ee0 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
17ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
17f00 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
17f10 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
17f20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17f30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17f40 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
17f50 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
17f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
17f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f80 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
17f90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
17fa0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
17fb0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
17fc0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
17fd0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
17fe0 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
17ff0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
18000 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
18010 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
18020 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
18030 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
18040 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
18050 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
18060 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
18070 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18080 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18090 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
180a0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
180b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
180c0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
180d0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
180e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
180f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18110 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
18120 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18130 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
18140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18150 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
18160 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
18170 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
18180 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
18190 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
181a0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
181b0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
181c0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
181d0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
181e0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
181f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
18200 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
18210 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
18220 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
18230 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
18240 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
18250 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
18260 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
18270 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
18280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18290 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
182a0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
182b0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
182c0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
182d0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
182e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
182f0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
18300 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
18310 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
18320 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
18340 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18350 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18370 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
18380 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18390 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
183a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
183b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
183c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
183d0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
183e0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
183f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18400 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18410 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
18420 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
18430 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
18440 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
18450 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
18460 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
18470 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18480 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
18490 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
184a0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
184b0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
184c0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
184d0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
184e0 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
184f0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
18500 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
18510 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
18520 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18530 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
18540 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
18550 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18560 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
18570 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18580 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
18590 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
185a0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
185b0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
185c0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
185d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
185e0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
185f0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
18600 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
18610 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18620 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18630 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
18640 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
18650 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
18660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18670 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18680 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18690 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
186a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
186b0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
186c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
186d0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
186e0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
186f0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
18700 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
18710 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
18720 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20  , pBuf, 1, 0);. 
18730 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18740 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18750 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
18760 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
18770 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
18780 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
18790 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
187a0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
187b0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
187c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
187d0 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
187e0 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
187f0 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
18800 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
18810 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
18820 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
18830 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
18840 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
18850 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
18860 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
18870 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
18880 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
18890 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
188a0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
188b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
188c0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
188d0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
188e0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
188f0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
18900 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
18910 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
18920 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
18930 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
18940 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
18950 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
18960 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
18970 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
18980 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
18990 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
189a0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
189b0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
189c0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
189d0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
189e0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
189f0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
18a00 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b  ssembly.** the k
18a10 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
18a20 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
18a30 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
18a40 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
18a50 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
18a60 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
18a70 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
18a80 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
18a90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18aa0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
18ab0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
18ac0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
18ad0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
18ae0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
18af0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
18b00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
18b10 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
18b20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
18b30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
18b40 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
18b50 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
18b60 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
18b70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18b80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
18b90 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
18ba0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
18bb0 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
18bc0 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
18bd0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
18be0 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
18bf0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
18c00 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
18c10 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
18c20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63  nKey;.  int nLoc
18c30 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
18c40 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
18c50 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
18c60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
18c70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
18c90 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
18ca0 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
18cb0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
18cc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18cd0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18ce0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
18cf0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
18d00 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
18d10 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
18d20 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61  pCell;.  aPayloa
18d30 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  d += pCur->info.
18d40 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
18d50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18d60 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
18d70 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
18d80 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
18d90 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69  y;.  }.  if( ski
18da0 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79  pKey ){.    aPay
18db0 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
18dc0 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
18dd0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e  >info.nLocal - n
18de0 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Key;.  }else{.  
18df0 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
18e00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
18e10 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65    if( nLocal>nKe
18e20 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61  y ){.      nLoca
18e30 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  l = nKey;.    }.
18e40 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
18e50 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
18e60 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
18e70 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
18e80 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
18e90 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
18ea0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
18eb0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
18ec0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
18ed0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
18ee0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
18ef0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
18f00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
18f10 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
18f20 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
18f30 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
18f40 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
18f50 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
18f60 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
18f70 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
18f80 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
18f90 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
18fa0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
18fb0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
18fc0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
18fd0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
18fe0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
18ff0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
19000 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
19010 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
19020 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
19030 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
19040 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
19050 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
19060 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
19070 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
19080 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
19090 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
190a0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
190b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
190c0 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
190d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
190e0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61   int *pAmt){.  a
190f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19100 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19110 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19120 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19130 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
19140 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
19150 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
19160 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
19170 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
19180 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
19190 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
191a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
191b0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
191c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
191d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
191e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
191f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19200 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
19210 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
19220 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
19230 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
19240 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
19250 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19260 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
19270 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
19280 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
19290 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
192a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
192b0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
192c0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
192d0 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
192e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
192f0 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
19300 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
19310 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65   *pNewPage;.  Me
19320 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b  mPage *pOldPage;
19330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19340 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
19350 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19360 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19380 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19390 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
193a0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
193b0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
193c0 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e  pNewPage, pCur->
193d0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
193e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
193f0 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72  pNewPage->idxPar
19400 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  ent = pCur->idx;
19410 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43  .  pOldPage = pC
19420 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c  ur->pPage;.  pOl
19430 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  dPage->idxShift 
19440 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
19450 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20  ge(pOldPage);.  
19460 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e  pCur->pPage = pN
19470 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
19480 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19490 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
194a0 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
194b0 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
194c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
194d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
194e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
194f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
19500 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19510 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74  page is the virt
19520 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  ual root of its 
19530 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
19540 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19550 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
19560 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62  age for most tab
19570 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72  les.  But.** for
19580 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
19590 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d  d on page 1, som
195a0 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72  etime the real r
195b0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65  oot page.** is e
195c0 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20  mpty except for 
195d0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
195e0 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  r.  In such case
195f0 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  s the.** virtual
19600 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19610 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
19620 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
19630 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f   page.** 1 is po
19640 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
19650 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
19660 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65  RootPage(MemPage
19670 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
19680 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20  age *pParent;.. 
19690 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
196a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
196b0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
196c0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
196d0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
196e0 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
196f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
19700 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31   pParent->pgno>1
19710 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19720 66 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61  f( get2byte(&pPa
19730 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
19740 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  ent->hdrOffset+3
19750 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
19760 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
19770 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19780 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
19790 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
197a0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
197b0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
197c0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
197d0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
197e0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
197f0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19800 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
19810 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
19820 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
19830 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
19840 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19850 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
19860 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
19870 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
19880 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
19890 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
198a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
198b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
198c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
198d0 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
198e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
198f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19900 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19910 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19920 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19930 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
19940 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
19950 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
19960 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42  ssert( !sqlite3B
19970 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
19980 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19990 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
199a0 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
199b0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
199c0 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
199d0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
199e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
199f0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19a00 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19a10 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
19a20 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
19a30 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19a40 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
19a50 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
19a60 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
19a70 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
19a80 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
19a90 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
19aa0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
19ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19ac0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
19ad0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
19ae0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
19af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19b00 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
19b10 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
19b20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19b30 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
19b40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19b50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19b60 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
19b70 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
19b80 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
19b90 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
19ba0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
19bb0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
19bc0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
19bd0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
19be0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
19bf0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
19c00 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
19c10 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
19c20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19c30 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
19c40 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
19c50 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  skip;.    }.    
19c60 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
19c70 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ion(pCur);.  }. 
19c80 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
19c90 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
19ca0 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  t && pRoot->pgno
19cb0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
19cc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19cd0 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b  pRoot->isInit );
19ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
19cf0 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
19d00 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
19d10 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
19d20 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
19d30 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b  Root, 0)).    ){
19d40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
19d50 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
19d60 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
19d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19d80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
19d90 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
19da0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f  Cur->pPage = pRo
19db0 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ot;.  }.  pCur->
19dc0 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19dd0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
19de0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
19df0 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
19e00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
19e10 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
19e20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
19e30 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
19e40 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
19e50 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
19e60 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
19e70 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
19e80 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
19e90 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
19ea0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
19eb0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
19ec0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
19ed0 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
19ee0 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
19ef0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
19f00 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
19f10 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
19f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19f30 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19f40 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
19f50 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
19f60 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19f70 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
19f80 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
19f90 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
19fa0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
19fb0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
19fc0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
19fd0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
19fe0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
19ff0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a000 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1a010 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1a020 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a030 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1a040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1a050 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a060 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a070 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a0a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a0b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a0c0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a0d0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a0e0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1a0f0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1a100 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1a110 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1a120 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1a130 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1a140 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1a150 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a160 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a180 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a190 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a1a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
1a1b0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a1c0 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
1a1d0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a1e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a1f0 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
1a200 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
1a210 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
1a220 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
1a230 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
1a240 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
1a250 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
1a260 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a270 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
1a280 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
1a290 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1a2a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1a2b0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a2c0 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
1a2d0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
1a2e0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
1a2f0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1a300 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
1a310 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
1a320 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a330 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1a340 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
1a350 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1a360 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1a370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1a380 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1a390 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a3a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a3b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a3c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a3d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1a3e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1a3f0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1a400 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1a410 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1a420 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1a430 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1a440 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1a450 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1a460 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1a470 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a480 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a490 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1a4a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1a4b0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1a4c0 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70  nCell - 1;.    p
1a4d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a4e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a4f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a500 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a510 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
1a520 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a530 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a540 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a550 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a560 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a570 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a580 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a590 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a5a0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a5b0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a5c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
1a5d0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
1a5e0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1a5f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a600 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a610 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a630 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1a640 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
1a650 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
1a660 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1a670 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1a680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a690 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a6a0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1a6b0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
1a6c0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1a6d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1a6e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1a6f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a700 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1a710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1a720 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
1a730 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1a740 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1a750 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1a760 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1a770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a780 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1a790 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1a7a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a7b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a7c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a7d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a7e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a7f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a800 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a810 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a820 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a830 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a840 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1a850 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1a860 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1a870 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1a880 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a890 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a8a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a8b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1a8c0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
1a8d0 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
1a8e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1a8f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1a900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a910 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1a920 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1a930 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1a940 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1a950 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1a960 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1a970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1a980 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a990 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a9a0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
1a9b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1a9c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1a9d0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1a9e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a9f0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1aa00 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1aa10 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1aa20 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65  ry near pKey/nKe
1aa30 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
1aa40 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1aa50 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1aa60 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1aa70 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1aa80 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
1aa90 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
1aaa0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e   other tables, n
1aab0 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Key is the numbe
1aac0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1aad0 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20  ta.** in pKey.  
1aae0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
1aaf0 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  unction specifie
1ab00 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  d when the curso
1ab10 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64  r was.** created
1ab20 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
1ab30 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  are keys..**.** 
1ab40 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1ab50 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1ab60 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1ab70 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1ab80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1ab90 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1aba0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1abb0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1abc0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1abd0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1abe0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1abf0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1ac00 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1ac10 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1ac20 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1ac30 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1ac40 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1ac50 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1ac60 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1ac70 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1ac80 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1ac90 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1aca0 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1acb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1acc0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1acd0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1ace0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1acf0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1ad00 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1ad10 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1ad20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1ad30 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1ad50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1ad60 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1ad70 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1ad80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1ad90 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1ada0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1adb0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1adc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1add0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1ade0 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1adf0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1ae00 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1ae10 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1ae20 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1ae30 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1ae40 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1ae50 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f  than pKey..**.*/
1ae60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ae70 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
1ae80 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1ae90 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1aea0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1aeb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1aec0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  y,      /* The k
1aed0 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69  ey content for i
1aee0 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65  ndices.  Not use
1aef0 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  d by tables */. 
1af00 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
1af10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1af20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65  of pKey.  Or the
1af30 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20   key for tables 
1af40 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
1af50 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ht,         /* I
1af60 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
1af70 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
1af80 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
1af90 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
1afa0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65      /* Search re
1afb0 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a  sult flag */.){.
1afc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1afd0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1afe0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1aff0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b000 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1b010 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
1b020 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  e->mutex) );.  r
1b030 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b040 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1b050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1b060 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b070 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1b080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b090 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b0a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b0b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b0c0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
1b0d0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
1b0e0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b0f0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1b100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b110 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b120 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b130 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b140 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b150 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b160 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b170 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b180 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b190 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1b1a0 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1b1b0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1b1c0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1b1d0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1b1e0 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  y && pKey==0 ){.
1b1f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b220 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
1b230 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75     pCur->idx = u
1b240 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
1b250 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1b260 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20   (upr+lwr)/2;.  
1b270 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c    }.    if( lwr<
1b280 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a  =upr ) for(;;){.
1b290 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
1b2a0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
1b2b0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1b2c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b2d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b2e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1b2f0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1b300 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
1b310 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1b320 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b  ge, pCur->idx) +
1b330 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
1b340 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1b350 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1b360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
1b370 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
1b380 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
1b390 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26  arint32(pCell, &
1b3a0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1b3b0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1b3c0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20  int(pCell, (u64 
1b3d0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1b3e0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1b3f0 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey<nKey ){.     
1b400 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1b410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1b420 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a  CellKey>nKey ){.
1b430 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
1b440 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1b450 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
1b460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b480 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a   int available;.
1b490 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1b4a0 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68   = (void *)fetch
1b4b0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61  Payload(pCur, &a
1b4c0 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20  vailable, 0);.  
1b4d0 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d        nCellKey =
1b4e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1b4f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
1b500 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
1b510 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1b520 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1b530 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1b540 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1b550 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1b560 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b570 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1b580 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1b590 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  c( nCellKey );. 
1b5a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1b5b0 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  llKey==0 ) retur
1b5c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b5d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b5e0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1b5f0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1b600 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1b610 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1b620 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1b630 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1b640 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1b650 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1b660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b670 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
1b680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b690 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1b6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b6c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b6d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1b6e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1b6f0 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
1b700 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1b710 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1b720 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  >idx;.          
1b730 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1b740 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b760 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
1b770 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  s ) *pRes = 0;. 
1b780 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1b7a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b7b0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
1b7c0 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1b7d0 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  ->idx+1;.      }
1b7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
1b7f0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b  r = pCur->idx-1;
1b800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b810 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
1b820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b830 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
1b840 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29  >idx = (lwr+upr)
1b850 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  /2;.    }.    as
1b860 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
1b870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b880 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1b890 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1b8a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
1b8b0 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ldPg = 0;.    }e
1b8c0 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61  lse if( lwr>=pPa
1b8d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1b8e0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1b8f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b900 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b910 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
1b920 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
1b930 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1b940 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
1b950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b960 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20   chldPg==0 ){.  
1b970 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b980 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1b990 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
1b9a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1b9b0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1b9c0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65  es = c;.      re
1b9d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b9e0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1b9f0 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70  idx = lwr;.    p
1ba00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ba10 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1ba20 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1ba30 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1ba40 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1ba50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ba60 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48  }.  /* NOT REACH
1ba70 45 44 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ED */.}.../*.** 
1ba80 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1ba90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1baa0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1bab0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1bac0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1bad0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1bae0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1baf0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1bb00 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1bb10 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1bb20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1bb30 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1bb40 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1bb50 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1bb60 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1bb70 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1bb80 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1bb90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1bba0 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1bbb0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1bbc0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1bbd0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1bbe0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1bbf0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1bc00 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1bc10 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1bc20 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1bc30 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1bc40 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1bc50 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1bc60 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1bc70 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1bc80 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1bc90 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1bca0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1bcb0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1bcc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bcd0 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72  handle for a cur
1bce0 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  sor..*/.sqlite3 
1bcf0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  *sqlite3BtreeCur
1bd00 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75  sorDb(const BtCu
1bd10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1bd20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1bd30 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1bd40 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d  pBtree->pSqlite-
1bd50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1bd60 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1bd70 2d 3e 70 53 71 6c 69 74 65 3b 0a 7d 0a 0a 2f 2a  ->pSqlite;.}../*
1bd80 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
1bd90 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
1bda0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
1bdb0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1bdc0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1bdd0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1bde0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1bdf0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1be00 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
1be10 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1be20 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1be30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1be40 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1be50 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73  et *pRes=1..*/.s
1be60 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4e  tatic int btreeN
1be70 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1be80 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1be90 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1bea0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1beb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bec0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bed0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1bee0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1bef0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1bf00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bf10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1bf20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bf30 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
1bf40 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1bf50 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1bf60 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1bf70 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1bf80 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1bf90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1bfa0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1bfb0 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1bfc0 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1bfd0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1bfe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bff0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1c000 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1c010 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1c020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c030 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1c040 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1c050 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1c060 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1c070 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  if( pCur->idx>=p
1c080 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1c090 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1c0a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1c0b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c0c0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
1c0d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c0e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
1c0f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1c100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c110 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1c120 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1c130 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c150 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
1c160 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
1c170 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1c180 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1c190 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1c1a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1c1b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1c1c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c1e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1c1f0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1c200 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1c210 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1c220 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  age;.    }while(
1c230 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67   pCur->idx>=pPag
1c240 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1c250 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
1c260 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1c270 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ta ){.      rc =
1c280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1c290 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
1c2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c2c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1c2d0 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
1c2e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1c2f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
1c300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c310 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
1c320 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1c330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c340 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c350 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
1c360 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1c370 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
1c380 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c390 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c3a0 20 20 72 63 20 3d 20 62 74 72 65 65 4e 65 78 74    rc = btreeNext
1c3b0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1c3c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c3d0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
1c3e0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
1c3f0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
1c400 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1c410 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1c420 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1c430 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1c440 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1c450 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1c460 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
1c470 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1c480 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1c490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c4a0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1c4b0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74  t *pRes=1..*/.st
1c4c0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 72  atic int btreePr
1c4d0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1c4e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c4f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
1c500 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50  gno pgno;.  MemP
1c510 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1c520 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1c530 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1c540 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1c550 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1c560 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1c590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53  ;.  }.  if( CURS
1c5a0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1c5b0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1c5c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1c5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c5e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1c5f0 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1c600 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1c610 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c630 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1c640 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1c650 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1c660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1c670 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1c680 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c690 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
1c6a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1c6b0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1c6c0 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
1c6d0 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
1c6e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1c6f0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1c700 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1c710 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c720 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1c730 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1c740 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1c750 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
1c760 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >idx==0 ){.     
1c770 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1c780 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1c790 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
1c7a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c7b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1c7c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1c7d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c7f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1c800 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1c810 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1c820 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1c830 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  e;.    }.    pCu
1c840 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43  r->idx--;.    pC
1c850 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1c860 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1c870 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21  e->leafData && !
1c880 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c8a0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1c8b0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1c8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c8d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c8e0 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
1c8f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1c900 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
1c910 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
1c920 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1c930 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1c940 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1c950 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c960 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r) );.  rc = btr
1c970 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
1c980 20 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   pRes);.  return
1c990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
1c9a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
1c9b0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
1c9c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c9d0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
1c9e0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1c9f0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
1ca00 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
1ca10 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
1ca20 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
1ca30 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
1ca40 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
1ca50 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
1ca60 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
1ca70 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
1ca80 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
1ca90 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1caa0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1cab0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
1cac0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
1cad0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
1cae0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1caf0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
1cb00 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
1cb10 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
1cb20 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
1cb30 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
1cb40 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
1cb50 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1cb60 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
1cb70 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
1cb80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1cb90 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
1cba0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1cbb0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
1cbc0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
1cbd0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
1cbe0 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
1cbf0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
1cc00 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
1cc10 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
1cc20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
1cc30 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
1cc40 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
1cc50 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
1cc60 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
1cc70 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
1cc80 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
1cc90 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
1cca0 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
1ccb0 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
1ccc0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
1ccd0 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
1cce0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1ccf0 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
1cd00 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
1cd10 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
1cd20 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
1cd30 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
1cd40 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
1cd50 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
1cd60 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
1cd70 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
1cd80 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
1cd90 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
1cda0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1cdb0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1cdc0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1cdd0 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
1cde0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
1cdf0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
1ce00 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
1ce10 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
1ce20 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
1ce30 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b  int rc;.  int n;
1ce40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ce50 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1ce60 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  reelist */.  int
1ce70 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
1ce80 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
1ce90 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
1cea0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
1ceb0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
1cec0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1ced0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20  revTrunk = 0;.. 
1cee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cef0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1cf00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
1cf10 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1cf20 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  1;.  n = get4byt
1cf30 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1cf40 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30  [36]);.  if( n>0
1cf50 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
1cf60 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
1cf70 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
1cf80 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
1cf90 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
1cfa0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
1cfb0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
1cfc0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
1cfd0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
1cfe0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
1cff0 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
1d000 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
1d010 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
1d020 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
1d030 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
1d040 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
1d050 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
1d060 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
1d070 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1d080 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
1d090 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
1d0a0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
1d0b0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
1d0c0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
1d0d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d0e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1d0f0 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
1d100 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  <=sqlite3PagerPa
1d110 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1d120 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38  ger) ){.      u8
1d130 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
1d140 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
1d150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d160 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1d170 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
1d180 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
1d190 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
1d1a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1d1b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d1c0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d1d0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1d1e0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1d1f0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
1d200 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
1d210 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
1d220 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
1d230 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
1d240 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
1d250 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
1d260 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
1d270 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
1d280 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
1d290 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
1d2a0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
1d2b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1d2c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1d2d0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1d2e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1d2f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
1d300 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d310 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
1d320 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
1d330 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
1d340 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
1d350 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
1d360 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
1d370 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
1d380 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
1d390 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
1d3a0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
1d3b0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
1d3c0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
1d3d0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
1d3e0 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
1d3f0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
1d400 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
1d410 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
1d420 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1d430 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1d440 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
1d450 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
1d460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d470 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
1d480 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1d490 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
1d4a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1d4b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1d4c0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
1d4d0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
1d4e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d4f0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1d500 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1d510 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1d520 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d530 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1d540 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
1d550 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
1d560 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
1d570 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1d580 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
1d590 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
1d5a0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
1d5b0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
1d5c0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
1d5d0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
1d5e0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
1d5f0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
1d600 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
1d610 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
1d620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
1d630 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
1d640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d650 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1d660 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1d670 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d680 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1d690 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1d6a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d6b0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
1d6c0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
1d6d0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1d6e0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1d6f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1d700 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1d710 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1d720 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1d730 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1d740 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1d750 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1d760 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1d770 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
1d780 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75  lse if( k>pBt->u
1d790 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
1d7a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
1d7b0 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
1d7c0 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
1d7d0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
1d7e0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
1d7f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d800 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
1d810 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d820 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
1d830 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d840 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
1d850 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26  f( searchList &&
1d860 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20   nearby==iTrunk 
1d870 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1d880 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
1d890 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
1d8a0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
1d8b0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
1d8c0 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
1d8d0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
1d8e0 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
1d8f0 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
1d900 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d910 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20   *pPgno==iTrunk 
1d920 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
1d930 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
1d940 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1d950 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
1d960 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d970 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1d980 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1d990 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d9a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1d9b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1d9c0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d9d0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1d9e0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1d9f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1da00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1da10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1da20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1da30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1da40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1da50 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
1da60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1da70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1da80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1da90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1daa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dab0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
1dac0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
1dad0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
1dae0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
1daf0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
1db00 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
1db10 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
1db20 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
1db30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
1db40 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1db50 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1db60 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1db70 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
1db80 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
1db90 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1dba0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
1dbb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
1dbc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1dbd0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
1dbe0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
1dbf0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
1dc00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dc10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dc20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1dc30 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1dc40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dc50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1dc60 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
1dc70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1dc80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dc90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dca0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1dcb0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1dcc0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1dcd0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1dce0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1dcf0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1dd00 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1dd10 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1dd20 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1dd30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1dd40 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1dd50 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1dd60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
1dd70 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
1dd80 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1dd90 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
1dda0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1ddb0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
1ddc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ddd0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1ddf0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1de00 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
1de10 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
1de20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1de30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de40 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
1de50 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1de60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1de70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1de80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1de90 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1dea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1deb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1dec0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1ded0 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
1dee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1def0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1df00 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1df10 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1df20 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1df30 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1df40 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1df50 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
1df60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df70 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
1df80 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
1df90 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  nk */.        in
1dfa0 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  t closest;.     
1dfb0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
1dfc0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
1dfd0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
1dfe0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
1dff0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e000 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1e010 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1e020 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e030 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1e040 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e060 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
1e070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1e080 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20  t i, dist;.     
1e090 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
1e0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
1e0b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1e0c0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
1e0e0 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
1e0f0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1e100 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
1e110 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1e120 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
1e130 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
1e140 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1e150 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
1e160 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
1e170 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
1e180 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
1e190 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
1e1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e1b0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
1e1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e1d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e1e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
1e1f0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
1e200 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
1e210 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1e220 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
1e230 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
1e240 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
1e250 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
1e260 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
1e270 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
1e280 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
1e290 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1e2a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e2b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1e2c0 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
1e2d0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
1e2e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
1e2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e300 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e310 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e320 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1e330 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
1e340 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
1e350 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
1e370 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
1e380 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
1e390 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
1e3a0 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
1e3b0 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
1e3c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1e3d0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1e3f0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
1e400 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
1e410 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
1e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e430 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
1e440 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1e450 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e460 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1e470 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1e480 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 1);.         
1e490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e4a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e4b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
1e4c0 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50  ntRollback((*ppP
1e4d0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1e4f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e500 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1e510 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e540 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1e550 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1e560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e580 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1e590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e5a0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
1e5b0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1e5c0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
1e5d0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
1e5e0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
1e5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e600 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
1e610 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1e620 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
1e630 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
1e640 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
1e650 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1e660 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33  *pPgno = sqlite3
1e670 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1e680 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b  Bt->pPager) + 1;
1e690 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e6a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e6b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
1e6c0 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  runc ){.      /*
1e6d0 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20   An incr-vacuum 
1e6e0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
1e6f0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
1e700 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a  saction. So the.
1e710 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f        ** page to
1e720 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74   allocate is not
1e730 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63   from the physic
1e740 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  al end of the fi
1e750 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  le, but.      **
1e760 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e   at pBt->nTrunc.
1e770 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1e780 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
1e790 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69  Trunc+1;.      i
1e7a0 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
1e7b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70  ) ){.        (*p
1e7d0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d  Pgno)++;.      }
1e7e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e7f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
1e800 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
1e810 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a  pBt, *pPgno) ){.
1e820 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
1e830 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
1e840 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1e850 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
1e860 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
1e870 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1e880 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
1e890 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
1e8a0 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
1e8b0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
1e8c0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
1e8d0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
1e8e0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
1e8f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
1e900 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45    */.      TRACE
1e910 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1e920 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1e930 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
1e940 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ge)\n", *pPgno))
1e950 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e960 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1e970 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e980 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
1e990 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
1e9a0 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b  ( pBt->nTrunc ){
1e9b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  .      pBt->nTru
1e9c0 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20  nc = *pPgno;.   
1e9d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
1e9e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1e9f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ea00 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
1ea10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1ea20 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
1ea30 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
1ea40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ea50 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1ea60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ea70 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1ea80 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ea90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1eaa0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1eab0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1eac0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
1ead0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1eae0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
1eaf0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
1eb00 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1eb10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1eb20 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
1eb30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
1eb40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1eb50 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
1eb60 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1eb70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1eb80 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67  ./*.** Add a pag
1eb90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1eba0 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72  e file to the fr
1ebb0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71  eelist..**.** sq
1ebc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ebd0 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20  ) is NOT called 
1ebe0 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
1ebf0 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
1ec00 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1ec10 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1ec20 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1ec30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1ec40 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1ec50 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b  ;.  int rc, n, k
1ec60 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20  ;..  /* Prepare 
1ec70 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65  the page for fre
1ec80 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  eing */.  assert
1ec90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1eca0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1ecb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ecc0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
1ecd0 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  >1 );.  pPage->i
1ece0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c  sInit = 0;.  rel
1ecf0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e  easePage(pPage->
1ed00 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67  pParent);.  pPag
1ed10 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
1ed20 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1ed30 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
1ed40 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
1ed50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1ed60 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1ed70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1ed80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ed90 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1eda0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1edb0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
1edc0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1edd0 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64  36], n+1);..#ifd
1ede0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
1edf0 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20  _DELETE.  /* If 
1ee00 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52  the SQLITE_SECUR
1ee10 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65  E_DELETE compile
1ee20 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
1ee30 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
1ee40 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
1ee50 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
1ee60 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
1ee70 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20  th zeros..  */. 
1ee80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ee90 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
1eea0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1eeb0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1eec0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
1eed0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
1eee0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
1eef0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1ef00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ef10 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74  VACUUM.  /* If t
1ef20 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
1ef30 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
1ef40 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
1ef50 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
1ef60 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
1ef70 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
1ef80 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
1ef90 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1efa0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1efb0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
1efc0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50  , pPage->pgno, P
1efd0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
1efe0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1eff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f000 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d  #endif..  if( n=
1f010 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1f020 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1f030 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ree page */.    
1f040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f050 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1f060 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f070 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f080 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1f090 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a  ->aData, 0, 8);.
1f0a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1f0b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1f0c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1f0d0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
1f0e0 50 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e  PAGE: %d first\n
1f0f0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
1f100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1f110 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67  * Other free pag
1f120 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  es already exist
1f130 2e 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66  .  Retrive the f
1f140 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  irst trunk page.
1f150 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72      ** of the fr
1f160 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20  eelist and find 
1f170 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61  out how many lea
1f180 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20  ves it has. */. 
1f190 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75     MemPage *pTru
1f1a0 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  nk;.    rc = sql
1f1b0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1f1c0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
1f1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f1e0 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  ]), &pTrunk, 0);
1f1f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d  turn rc;.    k =
1f210 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1f220 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
1f230 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73    if( k>=pBt->us
1f240 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1f250 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  {.      /* The t
1f260 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54  runk is full.  T
1f270 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69  urn the page bei
1f280 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20  ng freed into a 
1f290 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75  new.      ** tru
1f2a0 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20  nk page with no 
1f2b0 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20  leaves. */.     
1f2c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f2d0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
1f2e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
1f2f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f300 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
1f310 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1f320 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  a, pTrunk->pgno)
1f330 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1f340 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1f350 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  [4], 0);.       
1f360 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1f370 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50  1->aData[32], pP
1f380 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1f390 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
1f3a0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
1f3b0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
1f3c0 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ng %d\n",.      
1f3d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
1f3e0 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70  >pgno, pTrunk->p
1f3f0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gno));.      }. 
1f400 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30     }else if( k<0
1f410 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f420 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1f430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f440 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79  /* Add the newly
1f450 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61   freed page as a
1f460 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72   leaf on the cur
1f470 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20  rent trunk */.  
1f480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f490 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1f4a0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1f4b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f4c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f4d0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
1f4e0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29  ->aData[4], k+1)
1f4f0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1f500 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1f510 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d  a[8+k*4], pPage-
1f520 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20  >pgno);.#ifndef 
1f530 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1f540 4c 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c  LETE.        sql
1f550 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
1f560 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1f570 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  e);.#endif.     
1f580 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
1f590 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
1f5a0 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
1f5b0 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
1f5c0 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
1f5d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
1f5e0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1f5f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f600 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
1f610 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
1f620 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
1f630 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
1f640 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1f650 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
1f660 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
1f670 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
1f680 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
1f690 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1f6a0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
1f6b0 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
1f6c0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
1f6d0 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74  int nOvfl;.  int
1f6e0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
1f6f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f700 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1f710 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1f720 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1f730 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
1f740 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1f750 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
1f760 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
1f770 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f780 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
1f790 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
1f7a0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
1f7b0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
1f7c0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
1f7d0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
1f7e0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
1f7f0 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
1f800 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1f810 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
1f820 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
1f830 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
1f840 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
1f850 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
1f860 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
1f870 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
1f880 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
1f890 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  l-- ){.    MemPa
1f8a0 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69  ge *pOvfl;.    i
1f8b0 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  f( ovflPgno==0 |
1f8c0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74  | ovflPgno>sqlit
1f8d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1f8e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1f8f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f900 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f910 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  T;.    }..    rc
1f920 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
1f930 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
1f940 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c  , &pOvfl, (nOvfl
1f950 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f  ==0)?0:&ovflPgno
1f960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f970 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
1f980 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76  c = freePage(pOv
1f990 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fl);.    sqlite3
1f9a0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
1f9b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f9c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f9d0 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
1f9e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f9f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
1fa00 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
1fa10 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1fa20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
1fa30 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
1fa40 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
1fa50 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
1fa60 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
1fa70 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
1fa80 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
1fa90 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
1faa0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
1fab0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
1fac0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
1fad0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
1fae0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
1faf0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
1fb00 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
1fb10 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
1fb20 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
1fb30 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
1fb40 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
1fb50 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
1fb60 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
1fb70 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
1fb80 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
1fb90 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
1fba0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
1fbb0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
1fbc0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
1fbd0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
1fbe0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
1fbf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
1fc00 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
1fc10 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
1fc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fc30 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1fc40 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
1fc50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fc60 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
1fc70 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
1fc80 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
1fc90 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1fca0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
1fcb0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
1fcc0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
1fcd0 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
1fce0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
1fcf0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
1fd20 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
1fd30 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
1fd40 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1fd60 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
1fd70 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1fd80 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
1fd90 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
1fda0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
1fdb0 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
1fdc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
1fdd0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1fde0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
1fdf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fe00 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
1fe10 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
1fe20 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
1fe30 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1fe40 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
1fe50 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
1fe60 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
1fe70 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
1fe80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1fe90 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1fea0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
1feb0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
1fec0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
1fed0 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
1fee0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fef0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
1ff00 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
1ff10 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
1ff20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
1ff30 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
1ff40 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
1ff50 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1ff60 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
1ff70 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
1ff80 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
1ff90 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
1ffa0 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
1ffb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
1ffc0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1ffd0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1ffe0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1fff0 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
20000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
20010 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
20020 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
20030 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72  Data==nData+nZer
20040 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  o );.  .  /* Fil
20050 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
20060 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
20070 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
20080 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
20090 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
200a0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
200b0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
200c0 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
200d0 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  e{.    nPayload 
200e0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  += nKey;.    pSr
200f0 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
20100 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  rc = nKey;.  }. 
20110 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
20120 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
20130 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
20140 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
20150 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
20160 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
20170 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
20180 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
20190 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
201a0 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
201b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45  ){.      int isE
201c0 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65  xact = 0;.#ifnde
201d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
201e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
201f0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
20200 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
20210 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
20220 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
20230 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
20240 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20250 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
20260 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
20270 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
20280 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
20290 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
202a0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
202b0 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
202c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
202d0 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
202e0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76        if( pgnoOv
202f0 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  fl>1 ){.        
20300 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31    /* isExact = 1
20310 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  ; */.        }. 
20320 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20330 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
20340 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
20350 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
20360 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45  l, pgnoOvfl, isE
20370 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  xact);.#ifndef S
20380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20390 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
203a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
203b0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
203c0 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
203d0 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
203e0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
203f0 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
20400 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
20410 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
20420 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
20430 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
20440 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
20450 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
20460 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
20470 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
20480 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
20490 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
204a0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
204b0 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
204c0 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
204d0 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
204e0 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
204f0 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
20500 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
20510 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
20520 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
20530 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
20540 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
20550 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20  tialised values 
20560 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
20570 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
20580 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
20590 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
205a0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
205b0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
205c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
205d0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
205e0 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
205f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
20600 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
20610 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
20620 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
20630 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
20640 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20  noPtrmap);.     
20650 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
20660 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20670 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
20680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
20690 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
206a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
206b0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
206c0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
206d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
206e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
206f0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
20700 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
20710 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
20720 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
20730 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
20740 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
20750 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
20760 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
20770 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
20780 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
20790 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
207a0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
207b0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
207c0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
207d0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
207e0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
207f0 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66  paceLeft;.    if
20800 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
20810 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
20820 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
20830 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
20840 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
20850 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
20860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20870 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
20880 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
20890 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
208a0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
208b0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
208c0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
208d0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
208e0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
208f0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
20900 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
20910 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
20920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20930 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
20940 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
20950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20960 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d  .** Change the M
20970 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70  emPage.pParent p
20980 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61  ointer on the pa
20990 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20  ge whose number 
209a0 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74  is.** given in t
209b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
209c0 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61  nt so that MemPa
209d0 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  ge.pParent holds
209e0 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20   the.** pointer 
209f0 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67  in the third arg
20a00 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
20a10 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67   int reparentPag
20a20 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
20a30 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50   Pgno pgno, MemP
20a40 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c  age *pNewParent,
20a50 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d   int idx){.  Mem
20a60 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44  Page *pThis;.  D
20a70 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
20a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20a90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
20aa0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
20ab0 73 73 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e  ssert( pNewParen
20ac0 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67  t!=0 );.  if( pg
20ad0 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  no==0 ) return S
20ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
20af0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21  rt( pBt->pPager!
20b00 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  =0 );.  pDbPage 
20b10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
20b20 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
20b30 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
20b40 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54  DbPage ){.    pT
20b50 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  his = (MemPage *
20b60 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
20b70 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
20b80 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69      if( pThis->i
20b90 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61  sInit ){.      a
20ba0 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44  ssert( pThis->aD
20bb0 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
20bc0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
20bd0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
20be0 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70  This->pParent!=p
20bf0 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  NewParent ){.   
20c00 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
20c10 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65  pParent ) sqlite
20c20 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69  3PagerUnref(pThi
20c30 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  s->pParent->pDbP
20c40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54  age);.        pT
20c50 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
20c60 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
20c70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
20c80 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  ef(pNewParent->p
20c90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
20ca0 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
20cb0 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
20cc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20cd0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
20ce0 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ge);.  }..#ifnde
20cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20d00 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
20d10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20d20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
20d30 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
20d40 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
20d50 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
20d60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
20d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20d80 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
20d90 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
20da0 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
20db0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
20dc0 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
20dd0 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
20de0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
20df0 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
20e00 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
20e10 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
20e20 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
20e30 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
20e40 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
20e50 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
20e60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20e70 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
20e80 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
20e90 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
20ea0 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  o.** another..*/
20eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61  .static int repa
20ec0 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d  rentChildPages(M
20ed0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
20ee0 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61    int i;.  BtSha
20ef0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
20f00 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
20f10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20f30 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
20f40 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
20f50 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
20f60 61 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  af ) return SQLI
20f70 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d  TE_OK;..  for(i=
20f80 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
20f90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
20fa0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
20fb0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
20fc0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
20fd0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
20fe0 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74  reparentPage(pBt
20ff0 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
21000 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ), pPage, i);.  
21010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21020 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
21030 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
21040 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
21050 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61  ){.    rc = repa
21060 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65  rentPage(pBt, ge
21070 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
21080 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
21090 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20  ffset+8]), .    
210a0 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20     pPage, i);.  
210b0 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
210c0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
210d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
210e0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
210f0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
21100 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21110 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
21120 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
21130 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
21140 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
21150 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
21160 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
21170 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
21180 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
21190 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
211a0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
211b0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
211c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
211d0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
211e0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
211f0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
21200 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
21210 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
21220 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
21230 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
21240 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
21250 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21260 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21270 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
21280 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
21290 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
212a0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
212b0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
212c0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
212d0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
212e0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
212f0 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
21300 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
21310 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20  hin data[] */.. 
21320 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
21330 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
21340 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
21350 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
21360 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
21370 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
21380 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
21390 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
213a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
213b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
213c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
213d0 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
213e0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
213f0 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
21400 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
21410 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
21420 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
21430 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
21440 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
21450 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
21460 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
21470 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
21480 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
21490 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
214a0 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
214b0 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
214c0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
214d0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
214e0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
214f0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
21500 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
21510 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
21520 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
21530 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
21540 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
21550 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
21560 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
21570 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
21580 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
21590 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
215a0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
215b0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
215c0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
215d0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
215e0 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
215f0 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
21600 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
21610 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
21620 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
21630 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
21640 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
21650 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
21660 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
21670 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
21680 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
21690 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
216a0 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
216b0 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
216c0 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
216d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
216e0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
216f0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
21700 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
21710 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
21720 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
21730 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
21740 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
21750 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
21760 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
21770 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
21780 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
21790 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
217a0 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
217b0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
217c0 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
217d0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
217e0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
217f0 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
21800 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
21810 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
21820 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
21830 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
21840 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
21850 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
21860 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
21870 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
21880 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
21890 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
218a0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
218b0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
218c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
218d0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
218e0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
218f0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
21900 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
21910 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
21920 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
21930 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
21940 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
21950 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
21960 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
21970 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
21980 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
21990 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
219a0 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
219b0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
219c0 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
219d0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
219e0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
219f0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
21a00 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
21a10 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
21a20 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
21a30 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
21a40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21a50 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
21a60 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
21a70 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
21a80 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
21a90 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
21aa0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
21ab0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
21ac0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
21ad0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
21ae0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
21af0 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
21b00 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
21b10 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
21b20 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
21b30 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
21b40 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
21b50 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
21b60 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
21b70 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
21b80 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
21b90 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
21ba0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
21bb0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
21bc0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
21bd0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
21be0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
21bf0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
21c00 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
21c10 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
21c20 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
21c30 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
21c40 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
21c50 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
21c60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
21c70 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
21c80 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
21c90 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
21ca0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21cb0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
21cc0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
21cd0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
21ce0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
21cf0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
21d00 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
21d10 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
21d20 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
21d30 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
21d40 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
21d50 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
21d60 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
21d70 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
21d80 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67  t( j<sizeof(pPag
21d90 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
21da0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
21db0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
21dc0 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
21dd0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
21de0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
21df0 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = i;.    pPage->
21e00 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nFree = 0;.  }el
21e10 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
21e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21e30 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
21e40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
21e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21e70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21e80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
21e90 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
21ea0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
21eb0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
21ec0 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50  ta;.    hdr = pP
21ed0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
21ee0 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
21ef0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
21f00 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
21f10 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
21f20 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
21f30 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
21f40 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b  Page->nCell + 2;
21f50 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
21f60 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
21f70 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d   if( end > top -
21f80 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20   sz ){.      rc 
21f90 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
21fa0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
21fb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21fc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21fd0 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
21fe0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
21ff0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22000 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
22010 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
22020 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
22030 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
22040 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
22050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
22060 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
22070 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
22080 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
22090 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
220a0 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
220b0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
220c0 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
220d0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
220e0 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
220f0 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
22100 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
22110 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
22120 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
22130 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
22140 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
22150 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
22160 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
22170 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
22180 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
22190 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
221a0 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e  xShift = 1;.#ifn
221b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
221c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
221d0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
221e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
221f0 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
22200 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
22210 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
22220 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
22230 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
22240 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
22250 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
22260 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
22270 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
22280 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
22290 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
222a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
222b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
222c0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61   &info);.      a
222d0 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
222e0 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
222f0 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
22300 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
22310 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66  ;.      if( (inf
22320 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
22330 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
22340 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
22350 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
22360 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
22370 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
22380 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
22390 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
223a0 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
223b0 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
223c0 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
223d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
223e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
223f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
22400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22410 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
22420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22430 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
22440 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
22450 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
22460 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
22470 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
22480 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
22490 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
224a0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
224b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
224c0 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
224d0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
224e0 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
224f0 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
22500 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
22510 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
22520 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
22530 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
22540 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
22550 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
22560 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
22570 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20 20  /.  int *aSize  
22580 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
22590 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
225a0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
225b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
225c0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
225d0 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
225e0 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
225f0 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
22600 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
22610 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
22620 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
22630 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
22640 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
22650 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
22660 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
22670 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
22680 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
22690 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
226a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
226b0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
226c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
226d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
226e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
226f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22700 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22710 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  x) );.  totalSiz
22720 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
22730 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
22740 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
22750 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
22760 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
22770 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
22780 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
22790 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
227a0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c  ell==0 );.  cell
227b0 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
227c0 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
227d0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
227e0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
227f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
22800 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
22810 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  ], nCell);.  if(
22820 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65   nCell ){.    ce
22830 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74  llbody = allocat
22840 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f  eSpace(pPage, to
22850 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  talSize);.    as
22860 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30  sert( cellbody>0
22870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22880 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
22890 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  2*nCell );.    p
228a0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
228b0 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28  *nCell;.    for(
228c0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
228d0 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79  +){.      put2by
228e0 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72  te(&data[cellptr
228f0 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
22900 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
22910 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
22920 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
22930 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20  ;.      cellptr 
22940 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c  += 2;.      cell
22950 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  body += aSize[i]
22960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22970 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
22980 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
22990 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50  Size );.  }.  pP
229a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  age->nCell = nCe
229b0 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
229c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
229d0 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
229e0 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
229f0 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
22a00 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
22a10 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
22a20 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
22a30 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
22a40 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
22a50 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
22a60 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
22a70 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
22a80 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
22a90 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
22aa0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
22ab0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
22ac0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
22ad0 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
22ae0 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
22af0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
22b00 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
22b10 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
22b20 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
22b30 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
22b40 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
22b50 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
22b60 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
22b70 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
22b80 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
22b90 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
22ba0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
22bb0 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
22bc0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
22bd0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
22be0 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
22bf0 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
22c00 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
22c10 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
22c20 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
22c30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22c40 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
22c50 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
22c60 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
22c70 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
22c80 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
22c90 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
22ca0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f  alance */../* Fo
22cb0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
22cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
22cd0 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20  lance(MemPage*, 
22ce0 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  int);..#ifndef S
22cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
22d00 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
22d10 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
22d20 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
22d30 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
22d40 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
22d50 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
22d60 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
22d70 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
22d80 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
22d90 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
22da0 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
22db0 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
22dc0 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
22dd0 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
22de0 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
22df0 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
22e00 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
22e10 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
22e20 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
22e30 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
22e40 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
22e50 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
22e60 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
22e70 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
22e80 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
22e90 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
22ea0 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
22eb0 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
22ec0 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
22ed0 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
22ee0 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
22ef0 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
22f00 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
22f10 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
22f20 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
22f30 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
22f40 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
22f50 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
22f60 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
22f70 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
22f80 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
22f90 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
22fa0 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
22fb0 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
22fc0 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
22fd0 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
22fe0 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
22ff0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
23000 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
23010 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
23020 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
23030 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65   *pPage, MemPage
23040 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e   *pParent){.  in
23050 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
23060 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67  *pNew;.  Pgno pg
23070 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65  noNew;.  u8 *pCe
23080 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c  ll;.  int szCell
23090 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
230a0 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  o;.  BtShared *p
230b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
230c0 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
230d0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
230e0 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
230f0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
23100 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
23110 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23130 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
23140 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
23150 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
23160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23170 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
23180 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
23190 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
231a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
231b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
231c0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
231d0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
231e0 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
231f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
23200 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
23210 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
23220 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
23230 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
23240 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
23250 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
23260 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
23270 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
23280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23290 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
232a0 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
232b0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
232c0 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
232d0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
232e0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
232f0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
23300 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
23310 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
23320 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
23330 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
23340 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
23350 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
23360 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
23370 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
23380 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
23390 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
233a0 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
233b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
233c0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
233d0 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
233e0 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
233f0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
23400 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
23410 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  is.  ** so that 
23420 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
23430 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
23440 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
23450 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69  and.  ** pPage i
23460 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
23470 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f  ght child. .  */
23480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23490 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70  ->nCell>0 );.  p
234a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
234b0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
234c0 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  ell-1);.  sqlite
234d0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
234e0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
234f0 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20   &info);.  rc = 
23500 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
23510 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  nt, parentCell, 
23520 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
23530 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69   0, 0, &parentSi
23540 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
23550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23570 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53   assert( parentS
23580 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d  ize<64 );.  rc =
23590 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
235a0 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20  ent, parentIdx, 
235b0 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65  parentCell, pare
235c0 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20  ntSize, 0, 4);. 
235d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
235e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
235f0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62   rc;.  }.  put4b
23600 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
23610 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72  Cell(pParent,par
23620 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e  entIdx), pPage->
23630 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74  pgno);.  put4byt
23640 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
23650 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
23660 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
23670 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
23680 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23690 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  UM.  /* If this 
236a0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
236b0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
236c0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
236d0 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  ap.  ** with ent
236e0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
236f0 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
23700 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
23710 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68  .  ** cell on th
23720 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
23730 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
23740 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
23750 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
23760 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
23770 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
23780 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
23790 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
237a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
237b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
237c0 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
237d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
237e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
237f0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
23800 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20  ePage(pNew);.   
23810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23820 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
23830 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
23840 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
23850 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62  e new page and b
23860 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
23870 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20  t page,.  ** in 
23880 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72  case the divider
23890 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63   cell inserted c
238a0 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f  aused it to beco
238b0 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a  me overfull..  *
238c0 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  /.  releasePage(
238d0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
238e0 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
238f0 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   0);.}.#endif /*
23900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
23910 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
23920 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23930 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43   redistributes C
23940 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e  ells on pPage an
23950 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62  d up to NN*2 sib
23960 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67  lings.** of pPag
23970 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  e so that all pa
23980 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
23990 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  he same amount o
239a0 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a  f free space..**
239b0 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c   Usually NN sibl
239c0 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73  ings on either s
239d0 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20  ide of pPage is 
239e0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
239f0 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68  ncing,.** though
23a00 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d   more siblings m
23a10 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
23a20 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65  ne side if pPage
23a30 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
23a40 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
23a50 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49  f its parent.  I
23a60 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65  f pPage has fewe
23a70 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c  r than 2*NN sibl
23a80 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69  ings.** (somethi
23a90 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
23aa0 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67  y happen if pPag
23ab0 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  e is the root pa
23ac0 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c  ge or a .** chil
23ad0 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20  d of root) then 
23ae0 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
23af0 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61  blings participa
23b00 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
23b10 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
23b20 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
23b30 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74  s of pPage might
23b40 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
23b50 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
23b60 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61  e or.** two in a
23b70 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
23b80 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
23b90 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
23ba0 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70  full. The root p
23bb0 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61  age.** is specia
23bc0 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64  l and is allowed
23bd0 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d   to be nearly em
23be0 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73  pty. If pPage is
23bf0 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61   .** the root pa
23c00 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70  ge, then the dep
23c10 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d  th of the tree m
23c20 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
23c30 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65  d.** or decrease
23c40 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63  d by one, as nec
23c50 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20  essary, to keep 
23c60 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72  the root page fr
23c70 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72  om being.** over
23c80 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65  full or complete
23c90 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ly empty..**.** 
23ca0 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
23cb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
23cc0 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
23cd0 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he Cells on pPag
23ce0 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
23cf0 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
23d00 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  d in pPage->aDat
23d10 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68  a[].  This can h
23d20 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
23d30 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
23d40 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a  .  Part of the j
23d50 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
23d60 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65  ne is to.** make
23d70 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20   sure all Cells 
23d80 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61  for pPage once a
23d90 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67  gain fit in pPag
23da0 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a  e->aData[]..**.*
23db0 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
23dc0 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
23dd0 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
23de0 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f  ge, the parent o
23df0 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  f pPage.** might
23e00 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
23e10 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20   or underfull.  
23e20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c  If that happens,
23e30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
23e40 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
23e50 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
23e60 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  he parent..**.**
23e70 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
23e80 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
23e90 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
23ea0 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
23eb0 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
23ec0 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20  pted state.  So 
23ed0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
23ee0 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
23ef0 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
23f00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
23f10 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
23f20 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50  nce_nonroot(MemP
23f30 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
23f40 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
23f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23f60 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
23f70 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
23f80 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
23f90 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
23fa0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23fb0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23fd0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
23fe0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
23ff0 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
24000 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
24010 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
24020 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
24030 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
24040 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
24050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24060 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
24070 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
24080 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
24090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
240a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
240b0 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
240c0 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
240d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
240e0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
240f0 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
24100 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
24110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24120 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
24130 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24150 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
24160 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
24170 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
24180 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
24190 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
241a0 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
241b0 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
241c0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
241f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
24200 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
24210 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
24220 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
24230 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
24240 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
24250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24260 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
24270 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
24280 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
24290 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
242a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
242b0 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
242c0 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
242d0 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
242e0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
242f0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
24300 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
24310 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
24340 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
24350 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
24360 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20  nt iSpace = 0;  
24370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24380 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
24390 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a   of aSpace[] */.
243a0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
243b0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
243c0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
243d0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
243e0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
243f0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
24400 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
24410 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
24420 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
24430 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
24440 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
24450 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
24460 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
24470 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
24480 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
24490 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
244a0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
244b0 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
244c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
244d0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
244e0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
244f0 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
24500 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
24510 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24530 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
24540 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
24550 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
24560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24570 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
24580 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
24590 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
245a0 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
245b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
245c0 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
245d0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
245e0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
245f0 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
24600 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
24610 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
24620 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a  ced */.  int *sz
24630 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
24640 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
24650 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
24660 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
24670 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24690 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
246a0 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f  ing data of apCo
246b0 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  py[] */.  u8 *aS
246c0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
246d0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
246e0 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f  to hold copies o
246f0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
24700 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
24710 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24720 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d  UM.  u8 *aFrom =
24730 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   0;.#endif..  as
24740 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24750 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
24760 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
24770 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
24780 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
24790 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
247a0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
247b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
247c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
247d0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
247e0 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  e) || pPage->nOv
247f0 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70  erflow==1 );.  p
24800 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
24810 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
24820 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
24830 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
24840 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
24850 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
24860 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
24870 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
24880 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24890 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
248a0 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
248b0 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
248c0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
248d0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
248e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
248f0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
24900 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ANCE.  /*.  ** A
24910 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   special case:  
24920 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68  If a new entry h
24930 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
24940 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a  erted into a.  *
24950 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73  * table (that is
24960 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69  , a btree with i
24970 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20  nteger keys and 
24980 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20  all data at the 
24990 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64  leaves).  ** and
249a0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
249b0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
249c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
249d0 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20  ee (it has the. 
249e0 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29   ** largest key)
249f0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70   then use the sp
24a00 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75  ecial balance_qu
24a10 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ick() routine fo
24a20 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  r.  ** balancing
24a30 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  .  balance_quick
24a40 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65  () is much faste
24a50 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e  r and results in
24a60 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20   a tighter.  ** 
24a70 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20  packing of data 
24a80 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
24a90 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
24aa0 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20  Page->leaf &&.  
24ab0 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
24ac0 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  y &&.      pPage
24ad0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20 20  ->leafData &&.  
24ae0 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
24af0 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20  flow==1 &&.     
24b00 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
24b10 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  .idx==pPage->nCe
24b20 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ll &&.      pPag
24b30 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
24b40 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74  !=1 &&.      get
24b50 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
24b60 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
24b70 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50  drOffset+8])==pP
24b80 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20  age->pgno.  ){. 
24b90 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     /*.    ** TOD
24ba0 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62  O: Check the sib
24bb0 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66  lings to the lef
24bc0 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d  t of pPage. It m
24bd0 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a  ay be that.    *
24be0 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66  * they are not f
24bf0 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70  ull and no new p
24c00 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e  age is required.
24c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
24c20 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  rn balance_quick
24c30 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  (pPage, pParent)
24c40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
24c50 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
24c60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24c70 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
24c80 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
24c90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
24ca0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
24cb0 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
24cc0 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
24cd0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
24ce0 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
24cf0 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
24d00 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
24d10 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
24d20 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
24d30 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
24d40 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
24d50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
24d60 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
24d70 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
24d80 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
24d90 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
24da0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
24db0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
24dc0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
24dd0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
24de0 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
24df0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72  Page) );.    for
24e00 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72  (idx=0; idx<pPar
24e10 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b  ent->nCell; idx+
24e20 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65  +){.      if( ge
24e30 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
24e40 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d  pParent, idx))==
24e50 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
24e60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24e70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24e80 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
24e90 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
24ea0 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
24eb0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
24ec0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
24ed0 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d  8])==pgno );.  }
24ee0 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20  else{.    idx = 
24ef0 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
24f00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
24f10 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69   Initialize vari
24f20 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74  ables so that it
24f30 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f   will be safe to
24f40 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63   jump.  ** direc
24f50 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63  tly to balance_c
24f60 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f  leanup at any mo
24f70 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c  ment..  */.  nOl
24f80 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  d = nNew = 0;.  
24f90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
24fa0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
24fb0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
24fc0 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
24fd0 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
24fe0 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
24ff0 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
25000 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
25010 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
25020 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
25030 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
25040 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
25050 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
25060 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
25070 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
25080 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
25090 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
250a0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
250b0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
250c0 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
250d0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
250e0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
250f0 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
25100 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
25110 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
25120 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
25130 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
25140 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
25150 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
25160 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
25170 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
25180 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
25190 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
251a0 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
251b0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
251c0 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
251d0 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
251e0 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
251f0 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
25200 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
25210 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
25220 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
25230 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
25240 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
25250 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
25260 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
25270 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
25280 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
25290 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
252a0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
252b0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
252c0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
252d0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
252e0 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
252f0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
25300 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
25310 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
25320 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
25330 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
25340 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
25350 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
25360 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
25370 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
25380 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
25390 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
253a0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
253b0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
253c0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
253d0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
253e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
253f0 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
25400 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72  tiple of 2 in or
25410 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
25420 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
25430 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
25440 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
25450 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a  s + 1)&~1;..  /*
25460 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
25470 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
25480 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
25490 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
254a0 65 33 5f 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e3_malloc( .    
254b0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
254c0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254e0 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
254f0 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
25500 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20  *sizeof(int)    
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
25530 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e 44   */.     + ROUND
25540 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
25550 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20 20  ))*NB           
25560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43             /* aC
25570 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  opy */.     + pB
25580 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b 4e  t->pageSize*(5+N
25590 42 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B)              
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
255b0 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20 20   aSpace */.     
255c0 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20  + (ISAUTOVACUUM 
255d0 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29  ? nMaxCells : 0)
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
25600 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
25610 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
25620 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
25630 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
25640 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
25650 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
25660 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
25670 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38    aCopy[0] = (u8
25680 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
25690 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
256a0 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38  ((aCopy[0] - (u8
256b0 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
256c0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
256d0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
256e0 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20  d */.  for(i=1; 
256f0 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
25700 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
25710 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
25720 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
25730 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
25740 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
25750 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[i] - (u8*)apC
25760 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
25770 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
25780 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
25790 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20 26    }.  aSpace = &
257a0 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d  aCopy[NB-1][pBt-
257b0 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
257c0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
257d0 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  )];.  assert( ((
257e0 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61 70  aSpace - (u8*)ap
257f0 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
25800 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
25810 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
25820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25830 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25840 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
25850 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72  acuum ){.    aFr
25860 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a 70  om = &aSpace[5*p
25870 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
25880 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f   }.#endif.  .  /
25890 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  *.  ** Make copi
258a0 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  es of the conten
258b0 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69  t of pPage and i
258c0 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f  ts siblings into
258d0 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68   aOld[]..  ** Th
258e0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
258f0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
25900 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
25910 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a  opies rather.  *
25920 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
25930 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
25940 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
25950 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
25960 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f  e.  ** process o
25970 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
25980 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ten..  */.  for(
25990 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
259a0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
259b0 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  p = apCopy[i] = 
259c0 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b  (MemPage*)aCopy[
259d0 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
259e0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
259f0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
25a00 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f    p->aData = (vo
25a10 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d  id*)&p[1];.    m
25a20 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
25a30 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
25a40 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
25a50 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
25a60 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
25a70 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
25a80 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
25a90 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
25aa0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
25ab0 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
25ac0 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
25ad0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
25ae0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
25af0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
25b00 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61   form aSpace[] a
25b10 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
25b20 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
25b30 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
25b40 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
25b50 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
25b60 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
25b70 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
25b80 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
25b90 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
25ba0 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
25bb0 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
25bc0 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
25bd0 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
25be0 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69  Space[].  In thi
25bf0 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
25c00 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
25c10 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
25c20 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
25c30 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
25c40 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
25c50 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
25c60 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
25c70 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
25c80 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
25c90 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
25ca0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
25cb0 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
25cc0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
25cd0 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
25ce0 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
25cf0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
25d00 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
25d10 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
25d20 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
25d30 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
25d40 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
25d50 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a  */.  nCell = 0;.
25d60 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
25d70 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34   = pPage->leaf*4
25d80 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70  ;.  leafData = p
25d90 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
25da0 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  & pPage->leaf;. 
25db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
25dc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
25dd0 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
25de0 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c  py[i];.    int l
25df0 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
25e00 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
25e10 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
25e20 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
25e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
25e40 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
25e50 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
25e60 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
25e70 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
25e80 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
25e90 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
25ea0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
25eb0 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65  [nCell]);.#ifnde
25ec0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25ed0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
25ee0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
25ef0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  um ){.        in
25f00 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72  t a;.        aFr
25f10 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20  om[nCell] = i;. 
25f20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20         for(a=0; 
25f30 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  a<pOld->nOverflo
25f40 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; a++){.       
25f50 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76     if( pOld->aOv
25f60 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43  fl[a].pCell==apC
25f70 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20  ell[nCell] ){.  
25f80 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
25f90 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
25fa0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
25fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25fd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65  #endif.      nCe
25fe0 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
25ff0 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a  if( i<nOld-1 ){.
26000 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63        int sz = c
26010 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
26020 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
26030 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
26040 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
26050 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54  With the LEAFDAT
26060 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20  A flag, pParent 
26070 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20  cells hold only 
26080 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20  INTKEYs that.   
26090 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c       ** are dupl
260a0 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f  icates of keys o
260b0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
260c0 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  s.  We need to r
260d0 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a  emove.        **
260e0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
260f0 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c  ls from pParent,
26100 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72   but the divider
26110 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a  s cells are not.
26120 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
26130 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63   to apCell[] bec
26140 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75  ause they are du
26150 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c  plicates of chil
26160 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20  d cells..       
26170 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70   */.        drop
26180 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
26190 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
261a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
261b0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
261c0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
261d0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
261e0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
261f0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  l] = sz;.       
26200 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
26210 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  [iSpace];.      
26220 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a    iSpace += sz;.
26230 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26240 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67  iSpace<=pBt->pag
26250 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20  eSize*5 );.     
26260 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
26270 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
26280 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
26290 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
262a0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69  afCorrection;.#i
262b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
262c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
262d0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
262e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
262f0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
26300 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
26310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26320 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
26330 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
26340 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
26350 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43  [nCell] -= leafC
26360 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
26370 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
26380 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
26390 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
263a0 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
263b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
263c0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
263d0 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
263e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
263f0 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
26400 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
26410 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
26420 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
26430 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
26440 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
26450 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
26460 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
26470 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
26480 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
26490 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
264a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
264b0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
264c0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
264d0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
264e0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
264f0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
26500 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
26510 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
26520 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
26530 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
26540 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
26550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26560 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
26570 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26580 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
26590 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
265a0 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
265b0 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
265c0 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
265d0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
265e0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
265f0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
26600 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
26610 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
26620 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
26630 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
26640 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
26650 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
26660 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
26670 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
26680 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
26690 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
266a0 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
266b0 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
266c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
266d0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
266e0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
266f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
26700 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
26710 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
26720 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
26730 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
26740 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
26750 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
26760 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
26770 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
26780 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
26790 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
267a0 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
267b0 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
267c0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
267d0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
267e0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
267f0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
26800 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
26810 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
26820 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
26830 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
26840 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
26850 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
26860 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
26870 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
26880 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
26890 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
268a0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
268b0 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
268c0 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
268d0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
268e0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
268f0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
26900 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
26910 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
26920 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
26930 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
26940 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
26950 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
26960 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
26970 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
26980 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
26990 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
269a0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
269b0 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
269c0 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
269d0 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
269e0 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
269f0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
26a00 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
26a10 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
26a20 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
26a30 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
26a40 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
26a50 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
26a60 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
26a70 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
26a80 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
26a90 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
26aa0 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
26ab0 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
26ac0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
26ad0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
26ae0 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
26af0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
26b00 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
26b10 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
26b20 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
26b30 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
26b40 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
26b50 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
26b60 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
26b70 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
26b80 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
26b90 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
26ba0 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
26bb0 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
26bc0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
26bd0 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
26be0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
26bf0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
26c00 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
26c10 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
26c20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
26c30 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
26c40 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
26c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
26c60 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
26c70 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
26c80 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
26c90 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
26ca0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
26cb0 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
26cc0 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
26cd0 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
26ce0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
26cf0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
26d00 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
26d10 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
26d20 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
26d30 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
26d40 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
26d50 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
26d60 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
26d70 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
26d80 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
26d90 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
26da0 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
26db0 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
26dc0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
26dd0 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
26de0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
26df0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
26e00 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
26e10 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
26e20 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
26e30 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
26e40 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
26e50 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
26e60 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
26e70 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
26e80 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
26e90 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
26ea0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
26eb0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
26ec0 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
26ed0 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
26ee0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
26ef0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
26f00 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
26f10 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
26f20 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
26f30 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
26f40 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
26f50 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
26f60 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
26f70 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
26f80 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
26f90 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
26fa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
26fb0 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
26fc0 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
26fd0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
26fe0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
26ff0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
27000 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
27010 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
27020 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
27030 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
27040 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
27050 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
27060 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
27070 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27080 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
27090 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
270a0 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
270b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
270c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
270d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
270e0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
270f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
27100 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
27110 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
27120 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
27130 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
27140 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
27150 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
27160 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
27170 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
27180 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61      }.    zeroPa
27190 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
271a0 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  gs);.  }..  /* F
271b0 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
271c0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
271d0 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
271e0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
271f0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
27200 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
27210 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
27220 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
27230 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27240 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
27250 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
27260 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
27270 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
27280 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
27290 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
272a0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
272b0 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
272c0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
272d0 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
272e0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
272f0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
27300 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
27310 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
27320 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
27330 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
27340 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
27350 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
27360 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
27370 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
27380 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
27390 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
273a0 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
273b0 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
273c0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
273d0 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
273e0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
273f0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
27400 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
27410 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
27420 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
27430 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
27440 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
27450 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
27460 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
27470 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
27480 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
27490 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
274a0 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
274b0 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
274c0 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
274d0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
274e0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
274f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
27500 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e  ( pgnoNew[j]<(un
27510 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
27520 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
27530 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
27540 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20  pgnoNew[j];.    
27550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
27560 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
27570 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
27580 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
27590 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d    t = pgnoNew[i]
275a0 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
275b0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ew[i];.      pgn
275c0 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65  oNew[i] = pgnoNe
275d0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
275e0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
275f0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e  minI];.      pgn
27600 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a  oNew[minI] = t;.
27610 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
27620 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
27630 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  }.  TRACE(("BALA
27640 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
27650 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20  %d  new: %d(%d) 
27660 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
27670 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
27680 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20      pgnoOld[0], 
27690 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70  .    nOld>=2 ? p
276a0 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20  gnoOld[1] : 0,. 
276b0 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e     nOld>=3 ? pgn
276c0 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  oOld[2] : 0,.   
276d0 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e   pgnoNew[0], szN
276e0 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
276f0 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20  =2 ? pgnoNew[1] 
27700 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
27710 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
27720 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e   nNew>=3 ? pgnoN
27730 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[2] : 0, nNew>
27740 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
27750 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
27760 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c   pgnoNew[3] : 0,
27770 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
27780 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
27790 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34  w>=5 ? pgnoNew[4
277a0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  ] : 0, nNew>=5 ?
277b0 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
277c0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
277d0 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
277e0 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
277f0 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
27800 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
27810 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
27820 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
27830 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
27840 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
27850 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
27860 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
27870 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
27880 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
27890 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
278a0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
278b0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
278c0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
278d0 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70  t( pNew->pgno==p
278e0 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20  gnoNew[i] );.   
278f0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
27900 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
27910 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
27920 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
27930 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
27940 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
27950 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
27960 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27970 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
27980 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =0 );..#ifndef S
27990 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
279a0 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20  ACUUM.    /* If 
279b0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
279c0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
279d0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
279e0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a  ter map entries.
279f0 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e      ** that poin
27a00 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67  t to the sibling
27a10 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72  s that were rear
27a20 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61  ranged. These ca
27a30 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a  n be: left.    *
27a40 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65  * children of ce
27a50 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63  lls, the right-c
27a60 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65  hild of the page
27a70 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  , or overflow pa
27a80 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ges.    ** point
27a90 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a  ed to by cells..
27aa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
27ab0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
27ac0 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b  {.      for(k=j;
27ad0 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b   k<cntNew[i]; k+
27ae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
27af0 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( k<nMaxCells 
27b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
27b10 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c  From[k]==0xFF ||
27b20 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d   apCopy[aFrom[k]
27b30 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  ]->pgno!=pNew->p
27b40 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gno ){.         
27b50 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
27b60 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a  vfl(pNew, k-j);.
27b70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27b80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27b90 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27ba0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27bb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27bd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
27be0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
27bf0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
27c00 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
27c10 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
27c20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
27c30 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
27c40 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
27c50 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
27c60 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
27c70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c     */.    if( i<
27c80 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c  nNew-1 && j<nCel
27c90 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
27ca0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
27cb0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
27cc0 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
27cd0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
27ce0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
27cf0 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
27d00 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
27d10 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
27d20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  n;.      if( !pN
27d30 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
27d40 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
27d50 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
27d60 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70  l, 4);.        p
27d70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
27d80 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
27d90 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
27da0 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
27db0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
27dc0 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
27dd0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
27de0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
27df0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
27e00 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
27e10 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
27e20 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
27e30 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
27e40 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
27e50 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
27e60 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
27e70 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
27e80 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
27e90 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
27ea0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
27eb0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
27ec0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
27ed0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j--;.        sql
27ee0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
27ef0 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
27f00 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
27f10 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26         pCell = &
27f20 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
27f30 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65          fillInCe
27f40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  ll(pParent, pCel
27f50 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
27f60 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a   0, 0, 0, &sz);.
27f70 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b          iSpace +
27f80 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73  = sz;.        as
27f90 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42  sert( iSpace<=pB
27fa0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b  t->pageSize*5 );
27fb0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
27fc0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
27fd0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
27fe0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 4;.        pTe
27ff0 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  mp = &aSpace[iSp
28000 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  ace];.        iS
28010 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
28020 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
28030 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
28040 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  e*5 );.        /
28050 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
28060 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
28070 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
28080 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
28090 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
280a0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
280b0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
280c0 64 20 69 74 27 73 20 72 65 70 6f 72 74 65 64 20  d it's reported 
280d0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
280e0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
280f0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
28100 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
28110 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
28120 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
28130 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28140 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
28150 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
28160 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
28170 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 27  y cell). But it'
28180 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
28190 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
281a0 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
281b0 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
281c0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
281d0 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
281e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
281f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
28200 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
28210 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
28220 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
28230 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
28240 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
28250 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
28260 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
28270 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
28280 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
28290 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
282a0 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
282b0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
282c0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
282d0 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
282e0 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
282f0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
28300 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
28310 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
28320 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
28330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28340 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
28350 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
28360 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
28370 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20  pTemp, 4);.     
28380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28390 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
283a0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
283b0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
283c0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
283d0 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d  nt,nxDiv), pNew-
283e0 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20  >pgno);.#ifndef 
283f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
28400 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
28410 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
28420 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
28430 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65  se, and not a le
28440 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20  af-data tree,.  
28450 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61      ** then upda
28460 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
28470 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79  ap with an entry
28480 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
28490 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
284a0 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75  that the cell ju
284b0 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e  st inserted poin
284c0 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a  ts to (if any)..
284d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
284e0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
284f0 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61 20  um && !leafData 
28500 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28510 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
28520 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20  arent, nxDiv);. 
28530 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28550 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
28560 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28570 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
28580 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ndif.      j++;.
28590 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
285a0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
285b0 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
285c0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
285d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
285e0 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
285f0 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
28600 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  AF)==0 ){.    me
28610 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
28620 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  -1]->aData[8], &
28630 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
28640 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20  aData[8], 4);.  
28650 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  }.  if( nxDiv==p
28660 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
28670 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
28680 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
28690 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
286a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
286b0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
286c0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
286d0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
286e0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
286f0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
28700 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
28710 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
28720 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
28730 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
28740 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
28750 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
28760 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
28770 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
28780 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
28790 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
287a0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
287b0 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
287c0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
287d0 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e   /*.  ** Reparen
287e0 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c  t children of al
287f0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  l cells..  */.  
28800 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
28810 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
28820 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
28830 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  es(apNew[i]);.  
28840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28850 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
28860 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
28870 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
28880 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e  hildPages(pParen
28890 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
288a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
288b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
288c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e  .  /*.  ** Balan
288d0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
288e0 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ge.  Note that t
288f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
28900 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20  (pPage) might.  
28910 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ** have been add
28920 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
28930 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  st so it might n
28940 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74  o longer be init
28950 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75  ialized..  ** Bu
28960 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
28970 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
28980 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
28990 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
289a0 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
289b0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
289c0 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20  Parent, 0);.  . 
289d0 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
289e0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
289f0 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
28a00 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
28a10 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b  e3_free(apCell);
28a20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
28a30 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
28a40 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
28a50 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
28a60 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
28a70 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
28a80 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
28a90 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
28aa0 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
28ab0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
28ac0 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
28ad0 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
28ae0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
28af0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
28b00 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
28b10 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
28b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28b30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28b40 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
28b50 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
28b60 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
28b70 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
28b80 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
28b90 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
28ba0 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
28bb0 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
28bc0 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
28bd0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
28be0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
28bf0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
28c00 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
28c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28c20 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
28c30 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
28c40 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c60 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
28c70 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
28c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28ca0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
28cb0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
28cc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
28cf0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
28d00 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
28d10 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
28d20 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
28d30 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
28d40 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
28d50 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
28d60 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
28d70 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
28d80 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
28d90 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28db0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
28dc0 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
28dd0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
28de0 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
28df0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
28e00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
28e10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28e20 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28e30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42  ->mutex) );.  pB
28e40 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
28e50 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
28e60 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
28e70 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
28e80 65 33 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c  e3_malloc( mxCel
28e90 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66  lPerPage*(sizeof
28ea0 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74  (u8*)+sizeof(int
28eb0 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65  )) );.  if( apCe
28ec0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
28ed0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73  QLITE_NOMEM;.  s
28ee0 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61  zCell = (int*)&a
28ef0 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50  pCell[mxCellPerP
28f00 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67  age];.  if( pPag
28f10 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
28f20 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63  * The table is c
28f30 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
28f40 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42  */.    TRACE(("B
28f50 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61  ALANCE: empty ta
28f60 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ble %d\n", pPage
28f70 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
28f80 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  e{.    /* The ro
28f90 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
28fa0 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69   but has one chi
28fb0 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ld.  Transfer th
28fc0 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  e.    ** informa
28fd0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f  tion from that o
28fe0 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68  ne child into th
28ff0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69  e root page if i
29000 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66  t .    ** will f
29010 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  it.  This reduce
29020 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  s the depth of t
29030 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a  he tree by one..
29040 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
29050 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
29060 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73  s page 1, it has
29070 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69   less space avai
29080 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a  lable than.    *
29090 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65  * its child (due
290a0 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65   to the 100 byte
290b0 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63   header that occ
290c0 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  urs at the begin
290d0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ning.    ** of t
290e0 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29  he database fle)
290f0 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  , so it might no
29100 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c  t be able to hol
29110 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20  d all of the .  
29120 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
29130 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
29140 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c  ined in the chil
29150 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  d.  If this is t
29160 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c  he .    ** case,
29170 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20   then do not do 
29180 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c  the transfer.  L
29190 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74  eave page 1 empt
291a0 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  y except.    ** 
291b0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
291c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69  inter to the chi
291d0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68  ld page.  The ch
291e0 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ild page becomes
291f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74  .    ** the virt
29200 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  ual root of the 
29210 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
29220 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
29230 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
29240 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
29250 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
29260 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e  sert( pgnoChild>
29270 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
29280 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69   pgnoChild<=sqli
29290 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
292a0 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  t(pPage->pBt->pP
292b0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
292c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
292d0 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74  tPage(pPage->pBt
292e0 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
292f0 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66  hild, 0);.    if
29300 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
29310 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
29320 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
29330 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
29340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
29350 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
29360 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20  d, pPage);.     
29370 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
29380 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
29390 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ce;.      assert
293a0 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
293b0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  low==0 );.      
293c0 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65  if( pChild->nFre
293d0 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  e>=100 ){.      
293e0 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69    /* The child i
293f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20  nformation will 
29400 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  fit on the root 
29410 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a  page, so do the.
29420 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20          ** copy 
29430 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
29440 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61  ;.        zeroPa
29450 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
29460 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
29470 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
29480 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
29490 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
294a0 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43  pCell[i] = findC
294b0 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20  ell(pChild,i);. 
294c0 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
294d0 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
294e0 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b  (pChild, apCell[
294f0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
29500 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50         assembleP
29510 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
29520 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c  d->nCell, apCell
29530 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20  , szCell);.     
29540 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72     /* Copy the r
29550 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20  ight-pointer of 
29560 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65  the child to the
29570 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
29580 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
29590 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
295a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
295b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
295c0 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61  4byte(&pChild->a
295d0 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72  Data[pChild->hdr
295e0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
295f0 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
29600 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54  hild);.        T
29610 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29620 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65  child %d transfe
29630 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20  r to page 1\n", 
29640 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
29650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29660 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
29670 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72  d has more infor
29680 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
29690 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
296a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
296b0 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79   tree is already
296c0 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e   balanced.  Do n
296d0 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  othing. */.     
296e0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
296f0 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c  CE: child %d wil
29700 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67  l not fit on pag
29710 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
29720 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pgno));.      }.
29730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29740 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61   memcpy(pPage->a
29750 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Data, pChild->aD
29760 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  ata, pPage->pBt-
29770 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
29780 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
29790 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  t = 0;.      pPa
297a0 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
297b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
297c0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
297d0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
297e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
297f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
29800 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
29810 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
29820 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66  "BALANCE: transf
29830 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f  er child %d into
29840 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20   root %d\n",.   
29850 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c             pChil
29860 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e  d->pgno, pPage->
29870 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
29880 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
29890 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65 29  hildPages(pPage)
298a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
298b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
298c0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
298d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
298e0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
298f0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
29900 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
29910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
29920 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
29930 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70   .        rc = p
29940 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61  trmapPutOvfl(pPa
29950 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ge, i);.        
29960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
29980 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
29990 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20  balance;.       
299a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
299b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65  .#endif.    rele
299c0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
299d0 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77  .  }.end_shallow
299e0 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69  _balance:.  sqli
299f0 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
29a00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29a10 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  .../*.** The roo
29a20 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  t page is overfu
29a30 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ll.**.** When th
29a40 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61  is happens, Crea
29a50 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  te a new child p
29a60 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65  age and copy the
29a70 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
29a80 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68  the root into th
29a90 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d  e child.  Then m
29aa0 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  ake the root.** 
29ab0 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61  page an empty pa
29ac0 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69  ge with rightChi
29ad0 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ld pointing to t
29ae0 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e  he new.** child.
29af0 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c     Finally, call
29b00 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61   balance_interna
29b10 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63  l() on the new c
29b20 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65  hild.** to cause
29b30 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f   it to split..*/
29b40 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
29b50 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61  nce_deeper(MemPa
29b60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
29b70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29b80 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
29b90 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
29ba0 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
29bb0 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a  e *pChild;    /*
29bc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
29bd0 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
29be0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
29bf0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75  ;     /* Page nu
29c00 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
29c10 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
29c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
29c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
29c40 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
29c50 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  bleSize;     /* 
29c60 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a  Total usable siz
29c70 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20  e of a page */. 
29c80 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
29c90 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
29ca0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
29cb0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74  ge */.  u8 *cdat
29cc0 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  a;          /* C
29cd0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68  ontent of the ch
29ce0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ild page */.  in
29cf0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
29d00 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70    /* Offset to p
29d10 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61  age header in pa
29d20 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72  rent */.  int br
29d30 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
29d40 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65   Offset to conte
29d50 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  nt of first cell
29d60 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20   in parent */.. 
29d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29d80 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
29d90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29da0 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
29db0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
29dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29df0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
29e00 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68  eePage(pBt, &pCh
29e10 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c  ild, &pgnoChild,
29e20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29   pPage->pgno, 0)
29e30 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
29e40 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
29e50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
29e60 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
29e70 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29e80 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
29e90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
29ea0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
29eb0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
29ec0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
29ed0 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28   brk = get2byte(
29ee0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
29ef0 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
29f00 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
29f10 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
29f20 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
29f30 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
29f40 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
29f50 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c  cpy(&cdata[brk],
29f60 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
29f70 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20  bleSize-brk);.  
29f80 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
29f90 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
29fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29fb0 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
29fc0 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   pPage);.  if( r
29fd0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
29fe0 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65  deeper_out;.  me
29ff0 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
2a000 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  fl, pPage->aOvfl
2a010 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  , pPage->nOverfl
2a020 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  ow*sizeof(pPage-
2a030 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
2a040 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2a050 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2a060 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c  low;.  if( pChil
2a070 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
2a080 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65      pChild->nFre
2a090 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2a0a0 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65  ert( pChild->nCe
2a0b0 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ll==pPage->nCell
2a0c0 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
2a0d0 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
2a0e0 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
2a0f0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
2a100 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2a110 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2a120 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ], pgnoChild);. 
2a130 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2a140 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
2a150 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  nto %d\n", pPage
2a160 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
2a170 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20  pgno));.#ifndef 
2a180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a190 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
2a1a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2a1b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72      int i;.    r
2a1c0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2a1d0 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c  t, pChild->pgno,
2a1e0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2a1f0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
2a200 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2a210 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2a220 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2a230 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2a240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
2a250 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2a260 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20  Child, i);.     
2a270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2a290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2a2a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a2b0 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  f.  rc = balance
2a2c0 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29  _nonroot(pChild)
2a2d0 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72  ;..balancedeeper
2a2e0 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2a2f0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72  age(pChild);.  r
2a300 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a310 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65  ** Decide if the
2a320 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64   page pPage need
2a330 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
2a340 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20  .  If balancing 
2a350 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  is.** required, 
2a360 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72  call the appropr
2a370 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72  iate balancing r
2a380 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
2a390 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
2a3a0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2a3b0 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74  t insert){.  int
2a3c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a3d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a3e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a3f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a400 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2a410 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
2a420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a430 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2a440 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2a450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a460 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
2a470 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
2a480 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
2a490 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  per(pPage);.    
2a4a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2a4b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2a4c0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
2a4d0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2a4e0 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65  _shallower(pPage
2a4f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2a500 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
2a510 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  >nOverflow>0 || 
2a520 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72  .        (!inser
2a530 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  t && pPage->nFre
2a540 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  e>pPage->pBt->us
2a550 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b  ableSize*2/3) ){
2a560 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2a570 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67  nce_nonroot(pPag
2a580 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2a590 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a5a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a5b0 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73   checks all curs
2a5c0 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ors that point t
2a5d0 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74  o table pgnoRoot
2a5e0 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ..** If any of t
2a5f0 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72  hose cursors wer
2a600 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
2a610 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66  Flag==0 in a dif
2a620 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  ferent.** databa
2a630 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61  se connection (a
2a640 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a650 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73  tion that shares
2a660 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61   the pager.** ca
2a670 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72  che with the cur
2a680 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  rent connection)
2a690 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20   and that other 
2a6a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69  connection .** i
2a6b0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61  s not in the Rea
2a6c0 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74  dUncommmitted st
2a6d0 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ate, then this r
2a6e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a  outine returns .
2a6f0 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ** SQLITE_LOCKED
2a700 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74  ..**.** In addit
2a710 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20  ion to checking 
2a720 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28  for read-locks (
2a730 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  where a read-loc
2a740 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75  k .** means a cu
2a750 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68  rsor opened with
2a760 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73   wrFlag==0) this
2a770 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f   routine also mo
2a780 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65  ves.** all write
2a790 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74   cursors so that
2a7a0 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
2a7b0 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69  ng to the .** fi
2a7c0 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20  rst Cell on the 
2a7d0 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73  root page.  This
2a7e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
2a7f0 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20  cause an insert 
2a800 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69  .** or delete mi
2a810 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e  ght change the n
2a820 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
2a830 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65  n a page or dele
2a840 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74  te.** a page ent
2a850 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20  irely and we do 
2a860 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76  not want to leav
2a870 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a  e any cursors .*
2a880 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f  * pointing to no
2a890 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65 73  n-existant pages
2a8a0 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74   or cells..*/.st
2a8b0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
2a8c0 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  adLocks(Btree *p
2a8d0 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  Btree, Pgno pgno
2a8e0 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
2a8f0 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43  pExclude){.  BtC
2a900 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
2a910 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
2a920 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74  ee->pBt;.  sqlit
2a930 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d  e3 *db = pBtree-
2a940 3e 70 53 71 6c 69 74 65 3b 0a 20 20 61 73 73 65  >pSqlite;.  asse
2a950 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2a960 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
2a970 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  e) );.  for(p=pB
2a980 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
2a990 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
2a9a0 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20  if( p==pExclude 
2a9b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2a9c0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2a9d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2a9e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2a9f0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e  p->pgnoRoot!=pgn
2aa00 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65  oRoot ) continue
2aa10 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
2aa20 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  lag==0 ){.      
2aa30 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
2aa40 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53   = p->pBtree->pS
2aa50 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28  qlite;.      if(
2aa60 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20   dbOther==0 ||. 
2aa70 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72          (dbOther
2aa80 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
2aa90 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2aaa0 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2aab0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
2aac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2aad0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
2aae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
2aaf0 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e  pPage->pgno!=p->
2ab00 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
2ab10 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b    moveToRoot(p);
2ab20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ab30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ab40 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2ab50 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
2ab60 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
2ab70 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
2ab80 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
2ab90 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
2aba0 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
2abb0 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
2abc0 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
2abd0 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
2abe0 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
2abf0 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
2ac00 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
2ac10 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2ac20 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2ac30 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2ac40 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
2ac50 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
2ac60 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
2ac70 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
2ac80 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
2ac90 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
2aca0 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
2acb0 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
2acc0 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
2acd0 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
2ace0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
2acf0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
2ad00 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2ad10 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2ad20 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
2ad30 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
2ad40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2ad50 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2ad60 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2ad70 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2ad80 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
2ad90 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
2ada0 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
2adb0 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
2adc0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
2add0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
2ade0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2adf0 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
2ae00 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2ae10 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
2ae20 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
2ae30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ae40 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
2ae50 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
2ae60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2ae70 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
2ae80 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  New;.  MemPage *
2ae90 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
2aea0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2aeb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2aec0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
2aed0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
2aee0 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
2aef0 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
2af00 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2af10 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2af20 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
2af30 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2af40 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
2af50 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
2af60 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2af70 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
2af80 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  n insert */.    
2af90 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2afa0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2afb0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2afc0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2afd0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2afe0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2aff0 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d   );.  if( !pCur-
2b000 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
2b010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2b020 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  M;   /* Cursor n
2b030 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  ot open for writ
2b040 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2b050 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2b060 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2b070 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2b080 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ur) ){.    retur
2b090 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2b0a0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2b0b0 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2b0c0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2b0d0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2b0e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2b0f0 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
2b100 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
2b110 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2b120 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2b130 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2b140 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
2b150 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75  ble */.  clearCu
2b160 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b170 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53  r);.  if( .    S
2b180 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2b190 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2b1a0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2b1b0 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20  ot, pCur)) ||.  
2b1c0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
2b1d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2b1e0 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
2b1f0 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
2b200 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  as, &loc)).  ){.
2b210 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b220 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2b230 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2b240 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2b250 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
2b260 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b270 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
2b280 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
2b290 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
2b2a0 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
2b2b0 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
2b2c0 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
2b2d0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2b2e0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
2b2f0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
2b300 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
2b310 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
2b320 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
2b330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b340 69 73 49 6e 69 74 20 29 3b 0a 20 20 6e 65 77 43  isInit );.  newC
2b350 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
2b360 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  lloc( MX_CELL_SI
2b370 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28  ZE(pBt) );.  if(
2b380 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
2b390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b3a0 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
2b3b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
2b3c0 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
2b3d0 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
2b3e0 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
2b3f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2b400 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
2b410 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
2b420 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
2b430 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
2b440 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
2b450 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2b460 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
2b470 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2b480 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2b490 20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20     int szOld;.  
2b4a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b4b0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
2b4c0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
2b4d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2b4e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b4f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2b500 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2b510 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
2b520 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ert;.    }.    o
2b530 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
2b540 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2b550 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2b560 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b570 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2b580 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2b590 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2b5a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2b5b0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2b5c0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2b5d0 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2b5e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b5f0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2b600 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2b610 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2b620 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
2b630 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
2b640 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
2b650 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b660 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
2b670 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
2b680 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2b690 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2b6a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b6b0 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
2b6c0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2b6d0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b6e0 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
2b6f0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2b700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2b710 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2b720 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2b730 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71  age, 1);.  /* sq
2b740 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75  lite3BtreePageDu
2b750 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43  mp(pCur->pBt, pC
2b760 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ur->pgnoRoot, 1)
2b770 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68  ; */.  /* fflush
2b780 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69  (stdout); */.  i
2b790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b7a0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2b7b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
2b7c0 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69  d_insert:.  sqli
2b7d0 74 65 33 5f 66 72 65 65 28 6e 65 77 43 65 6c 6c  te3_free(newCell
2b7e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2b800 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2b810 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2b820 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2b830 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2b840 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2b850 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2b860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b870 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2b880 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2b890 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2b8a0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73  ur->pPage;.  uns
2b8b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2b8c0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2b8d0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2b8e0 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2b8f0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2b900 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2b910 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2b920 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2b930 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2b940 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2b950 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2b960 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2b970 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2b980 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2b990 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2b9a0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2b9b0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2b9c0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2b9d0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2b9e0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2b9f0 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2ba00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ba10 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2ba20 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2ba30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2ba40 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2ba50 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2ba60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2ba70 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2ba80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ba90 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2baa0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2bab0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2bac0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2bad0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2bae0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2baf0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2bb00 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2bb10 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2bb20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2bb30 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2bb40 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2bb50 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2bb60 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2bb70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2bb80 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2bb90 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2bba0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2bbb0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
2bbc0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
2bbd0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2bbe0 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  n (a no-op if th
2bbf0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2bc00 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f  in .  ** CURSOR_
2bc10 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2bc20 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20  e) and save the 
2bc30 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2bc40 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a   other cursors .
2bc50 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65    ** open on the
2bc60 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65   same table. The
2bc70 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  n call sqlite3Pa
2bc80 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
2bc90 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74  e page.  ** that
2bca0 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20   the entry will 
2bcb0 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e  be deleted from.
2bcc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
2bcd0 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72   (rc = restoreOr
2bce0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2bcf0 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
2bd00 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2bd10 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2bd20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2bd30 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2bd40 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2bd50 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2bd60 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2bd70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2bd80 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2bd90 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2bda0 20 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c   it's page and l
2bdb0 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74  eave pCell point
2bdc0 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ing to the.  ** 
2bdd0 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43  data. The clearC
2bde0 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73  ell() call frees
2bdf0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2be00 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2be10 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ith the.  ** cel
2be20 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65  l. The cell itse
2be30 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61  lf is still inta
2be40 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c  ct..  */.  pCell
2be50 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2be60 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2be70 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2be80 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
2be90 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
2bea0 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
2beb0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2bec0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
2bed0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2bee0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
2bef0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2bf00 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
2bf10 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
2bf20 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
2bf30 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
2bf40 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
2bf50 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
2bf60 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
2bf70 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
2bf80 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
2bf90 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
2bfa0 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
2bfb0 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
2bfc0 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
2bfd0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
2bfe0 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
2bff0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
2c000 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2c010 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
2c020 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
2c030 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
2c040 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
2c050 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
2c060 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2c070 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Next;.    int sz
2c080 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  Next;  /* The co
2c090 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69  mpiler warning i
2c0a0 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20  s wrong: szNext 
2c0b0 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20  is always .     
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2c0d0 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
2c0e0 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61  e use.  Adding a
2c0f0 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  n extra initiali
2c100 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  zation.         
2c110 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69          ** to si
2c120 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c  lence the compil
2c130 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68  er slows down th
2c140 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  e code. */.    i
2c150 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
2c160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
2c170 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
2c180 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
2c190 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20  >leafData );.   
2c1a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2c1b0 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2c1c0 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2c1d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c1e0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2c1f0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2c200 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c210 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2c220 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c230 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2c240 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2c250 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
2c270 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2c280 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2c290 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2c2a0 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2c2b0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2c2c0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2c2d0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c  , pPage->pgno, l
2c2e0 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67  eafCur.pPage->pg
2c2f0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2c300 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c310 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c320 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c330 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
2c340 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75   findCell(leafCu
2c350 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c360 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e  .idx);.      szN
2c370 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2c380 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  r(leafCur.pPage,
2c390 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2c3a0 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2c3b0 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2c3c0 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  +4 );.      temp
2c3d0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cell = sqlite3_m
2c3e0 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53  alloc( MX_CELL_S
2c3f0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  IZE(pBt) );.    
2c400 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
2c410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2c420 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c460 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2c470 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70  ge, pCur->idx, p
2c480 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
2c490 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
2c4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c4b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c4c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2c4d0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2c4e0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2c4f0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2c500 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c510 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
2c520 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2c530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c540 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75   dropCell(leafCu
2c550 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c560 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  .idx, szNext);. 
2c570 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2c580 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  e(leafCur.pPage,
2c590 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2c5a0 71 6c 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70  qlite3_free(temp
2c5b0 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Cell);.    sqlit
2c5c0 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
2c5d0 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75  mpCursor(&leafCu
2c5e0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2c5f0 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2c600 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2c610 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2c620 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ,.       pCur->p
2c630 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2c640 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70  pgno));.    drop
2c650 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c660 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c670 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c680 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  );.    rc = bala
2c690 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2c6a0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2c6b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2c6c0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2c6d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c6e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2c6f0 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
2c700 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
2c710 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
2c720 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
2c730 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2c740 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
2c750 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
2c760 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
2c770 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
2c780 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
2c790 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
2c7a0 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
2c7b0 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
2c7c0 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
2c7d0 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
2c7e0 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
2c7f0 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
2c800 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
2c810 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
2c820 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
2c830 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
2c840 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
2c850 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
2c860 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
2c870 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
2c880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2c890 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2c8a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2c8b0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2c8c0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2c8d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
2c8e0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2c8f0 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
2c900 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2c910 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2c920 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2c930 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2c940 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2c950 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2c960 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2c970 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
2c980 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2c990 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2c9a0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2c9b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2c9c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2c9d0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2c9e0 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
2c9f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ca00 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2ca10 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2ca20 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2ca30 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2ca40 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2ca50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ca60 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
2ca70 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2ca80 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
2ca90 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
2caa0 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
2cab0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2cac0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
2cad0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cae0 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
2caf0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
2cb00 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
2cb10 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
2cb20 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
2cb30 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
2cb40 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
2cb50 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
2cb60 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
2cb70 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
2cb80 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
2cb90 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
2cba0 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
2cbb0 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
2cbc0 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
2cbd0 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
2cbe0 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
2cbf0 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
2cc00 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
2cc10 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2cc20 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
2cc30 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
2cc40 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
2cc50 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2cc60 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
2cc70 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
2cc80 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2cc90 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
2cca0 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
2ccb0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2ccc0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2ccd0 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
2cce0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
2ccf0 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
2cd00 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2cd10 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2cd20 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
2cd30 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
2cd40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cd50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cd60 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
2cd70 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2cd80 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2cd90 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2cda0 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2cdb0 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2cdc0 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2cdd0 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2cde0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
2cdf0 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2ce00 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2ce10 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2ce20 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2ce30 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2ce40 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2ce50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2ce60 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2ce70 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2ce80 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2ce90 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2cea0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2ceb0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2cec0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2ced0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2cee0 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2cef0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2cf00 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2cf10 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2cf20 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2cf30 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2cf40 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2cf50 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2cf60 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2cf70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cf80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cf90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2cfa0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2cfb0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2cfc0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2cfd0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2cfe0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2cff0 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2d000 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2d010 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2d020 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2d030 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2d040 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2d050 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2d060 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2d070 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2d080 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2d090 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2d0a0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2d0b0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2d0c0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2d0d0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2d0e0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2d0f0 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2d100 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2d110 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2d120 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2d130 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2d140 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2d150 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2d160 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2d170 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2d180 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2d190 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2d1a0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2d1b0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2d1c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d1d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d1e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d1f0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2d200 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2d210 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2d220 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2d230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d240 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2d250 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2d260 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2d270 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2d280 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d290 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d2a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d2b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2d2c0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2d2d0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2d2e0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2d2f0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2d300 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d310 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2d320 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2d330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d360 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d370 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d380 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2d390 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2d3a0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2d3b0 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2d3c0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d3d0 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
2d3e0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
2d3f0 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
2d400 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2d410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d420 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d440 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d450 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
2d460 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2d470 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2d480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d4c0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2d4d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2d4e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d4f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d500 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d510 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2d530 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2d540 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2d550 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2d560 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2d570 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2d580 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2d590 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2d5a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2d5b0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2d5c0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2d5d0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2d5e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2d5f0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d600 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d610 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2d620 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2d630 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2d640 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2d650 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2d660 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d670 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d680 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2d690 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2d6a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d6b0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2d6c0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2d6d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d6e0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2d6f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d700 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d710 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2d720 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2d730 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2d740 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2d750 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2d760 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2d770 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2d780 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2d790 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d7a0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2d7b0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2d7c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2d7d0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2d7e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2d7f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2d800 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
2d810 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
2d820 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
2d830 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2d840 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2d850 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
2d860 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
2d870 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
2d880 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
2d890 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
2d8a0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
2d8b0 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
2d8c0 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
2d8d0 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
2d8e0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2d8f0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
2d900 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2d910 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
2d920 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
2d930 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2d940 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
2d950 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2d960 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
2d970 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20  page.  NULL for 
2d980 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e  the root */.  in
2d990 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20  t freePageFlag  
2d9a0 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
2d9b0 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
2d9c0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2d9d0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
2d9e0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2d9f0 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
2da00 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
2da10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2da20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2da30 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71  );.  if( pgno>sq
2da40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2da50 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2da60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2da70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2da80 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2da90 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2daa0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2dab0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  , pParent);.  if
2dac0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2dad0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2dae0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
2daf0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2db00 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
2db10 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2db20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
2db30 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2db40 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2db50 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2db60 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
2db70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2db80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2db90 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2dba0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2dbb0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
2dbc0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2dbd0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2dbe0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2dbf0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2dc00 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2dc10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
2dc20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2dc30 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2dc40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2dc50 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  8]), pPage->pPar
2dc60 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ent, 1);.    if(
2dc70 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2dc80 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2dc90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
2dca0 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
2dcb0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2dcc0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
2dcd0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
2dce0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2dcf0 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
2dd00 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2dd10 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
2dd20 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
2dd30 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
2dd40 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
2dd50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2dd60 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2dd70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2dd80 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2dd90 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
2dda0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2ddb0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
2ddc0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2ddd0 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
2dde0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
2ddf0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
2de00 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
2de10 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2de20 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
2de30 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
2de40 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2de50 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2de60 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2de70 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2de80 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
2de90 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
2dea0 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
2deb0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
2dec0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
2ded0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
2dee0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2def0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2df00 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e  nt iTable){.  in
2df10 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
2df20 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2df30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2df40 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ter(p);.  if( p-
2df50 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2df60 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
2df70 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2df80 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2df90 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2dfa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
2dfb0 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
2dfc0 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
2dfd0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2dfe0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
2dff0 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  o do */.  }else 
2e000 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
2e010 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2e020 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
2e030 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e   0)) ){.    /* n
2e040 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
2e050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2e060 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2e070 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
2e080 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Table, 0, 0);.  
2e090 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
2e0a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2e0b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e0c0 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  Erase all inform
2e0d0 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65  ation in a table
2e0e0 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f   and add the roo
2e0f0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
2e100 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73  o.** the freelis
2e110 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20  t.  Except, the 
2e120 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e  root of the prin
2e130 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ciple table (the
2e140 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20   one on.** page 
2e150 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  1) is never adde
2e160 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2e170 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2e180 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
2e190 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
2e1a0 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
2e1b0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73  any open.** curs
2e1c0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2e1d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
2e1e0 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
2e1f0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74   and the page at
2e200 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74   iTable is not t
2e210 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20  he last.** root 
2e220 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2e230 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2e240 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2e250 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ge .** in the da
2e260 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2e270 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c  oved into the sl
2e280 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
2e290 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c  pied by.** iTabl
2e2a0 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20  e and that last 
2e2b0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2e2c0 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61  cupied by the la
2e2d0 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  st root page.** 
2e2e0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2e2f0 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64  freelist instead
2e300 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20   of iTable.  In 
2e310 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a  this say, all.**
2e320 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20   root pages are 
2e330 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69  kept at the begi
2e340 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
2e350 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
2e360 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72  h.** is necessar
2e370 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d  y for AUTOVACUUM
2e380 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20   to work right. 
2e390 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
2e3a0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   to the .** page
2e3b0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65   number that use
2e3c0 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74  d to be the last
2e3d0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2e3e0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a  e file before.**
2e3f0 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e   the move.  If n
2e400 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65  o page gets move
2e410 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  d, *piMoved is s
2e420 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20  et to 0..** The 
2e430 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2e440 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65  s recorded in me
2e450 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61  ta[3] and the va
2e460 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33  lue of.** meta[3
2e470 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  ] is updated by 
2e480 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
2e490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
2e4a0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
2e4b0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2e4c0 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
2e4d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2e4e0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2e4f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2e500 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2e510 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2e520 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2e530 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   );.  if( p->inT
2e540 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2e550 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
2e560 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2e570 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2e580 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2e590 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
2e5a0 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20  illegal to drop 
2e5b0 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
2e5c0 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
2e5d0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
2e5e0 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
2e5f0 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
2e600 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
2e610 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
2e620 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74  eed to move anot
2e630 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  her root-page to
2e640 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74   fill a gap left
2e650 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a   by the deleted.
2e660 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20    ** root page. 
2e670 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
2e680 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73  r was using this
2e690 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
2e6a0 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75  would .  ** occu
2e6b0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
2e6c0 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
2e6d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e6e0 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  LOCKED;.  }..  r
2e6f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e700 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  GetPage(pBt, (Pg
2e710 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67  no)iTable, &pPag
2e720 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  e, 0);.  if( rc 
2e730 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
2e740 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e750 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
2e760 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20  able);.  if( rc 
2e770 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2e780 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2e790 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e7a0 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a   *piMoved = 0;..
2e7b0 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29    if( iTable>1 )
2e7c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2e7d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2e7e0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2e7f0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2e800 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e810 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
2e820 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2e830 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61  ){.      Pgno ma
2e840 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2e850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e860 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2e870 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
2e880 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e8a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2e8b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2e8c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2e8d0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
2e8e0 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
2e8f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2e900 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2e910 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
2e920 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
2e930 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2e940 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2e950 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2e960 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
2e970 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
2e980 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
2e990 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2e9a0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2e9b0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2e9c0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e9d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e9e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e9f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ea00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ea10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2ea20 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2ea30 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
2ea40 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
2ea50 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2ea60 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2ea70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2ea80 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
2ea90 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
2eaa0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2eab0 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2eac0 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
2ead0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
2eae0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2eaf0 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
2eb00 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2eb10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2eb20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2eb30 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
2eb40 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
2eb50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2eb60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2eb70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2eb80 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2eb90 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2eba0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f  atePage(pBt, pMo
2ebb0 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ve, PTRMAP_ROOTP
2ebc0 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b  AGE, 0, iTable);
2ebd0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ebe0 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2ebf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ec00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ec10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ec20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ec30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2ec40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
2ec50 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
2ec60 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
2ec70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ec80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2ec90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2eca0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2ecb0 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
2ecc0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2ecd0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2ece0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ecf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ed00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ed10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ed20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
2ed30 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2ed40 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
2ed50 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
2ed60 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
2ed70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
2ed80 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
2ed90 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
2eda0 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
2edb0 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
2edc0 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
2edd0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
2ede0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
2edf0 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
2ee00 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
2ee10 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2ee20 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
2ee30 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
2ee40 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
2ee50 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
2ee60 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2ee70 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
2ee80 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2ee90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2eea0 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
2eeb0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2eec0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
2eed0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2eee0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2eef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
2ef00 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
2ef10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ef20 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
2ef30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2ef40 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
2ef50 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
2ef60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2ef70 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2ef80 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
2ef90 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2efa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
2efb0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
2efc0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2efd0 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
2efe0 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
2eff0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2f000 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
2f010 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
2f020 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2f030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f040 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
2f050 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
2f060 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
2f070 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
2f080 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
2f090 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2f0a0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
2f0b0 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
2f0c0 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
2f0d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2f0e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2f0f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2f100 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
2f110 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
2f120 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2f130 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2f140 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
2f150 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
2f160 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
2f170 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
2f180 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
2f190 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
2f1a0 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
2f1b0 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
2f1c0 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
2f1d0 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
2f1e0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
2f1f0 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
2f200 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
2f210 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
2f220 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
2f230 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
2f240 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
2f250 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
2f260 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
2f270 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
2f280 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
2f290 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
2f2a0 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
2f2b0 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
2f2c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f2d0 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
2f2e0 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
2f2f0 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
2f300 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74   *pDbPage;.  int
2f310 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2f320 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
2f330 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2f340 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
2f350 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  treeEnter(p);.. 
2f360 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65   /* Reading a me
2f370 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65  ta-data value re
2f380 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
2f390 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e  ck on page 1 (an
2f3a0 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65  d hence.  ** the
2f3b0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2f3c0 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68  able. We grab th
2f3d0 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65  is lock regardle
2f3e0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2f3f0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51  .  ** not the SQ
2f400 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2f410 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
2f420 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74   (the table root
2f430 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20  ed at page.  ** 
2f440 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  1 is treated as 
2f450 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62  a special case b
2f460 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  y queryTableLock
2f470 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65  () and lockTable
2f480 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ())..  */.  rc =
2f490 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2f4a0 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2f4b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2f4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2f4d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2f4e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2f4f0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
2f500 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d   idx>=0 && idx<=
2f510 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  15 );.  rc = sql
2f520 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
2f530 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44  ->pPager, 1, &pD
2f540 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2f550 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
2f560 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2f570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2f580 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e  .  pP1 = (unsign
2f590 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
2f5a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2f5b0 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61  bPage);.  *pMeta
2f5c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
2f5d0 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20  [36 + idx*4]);. 
2f5e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2f5f0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ef(pDbPage);..  
2f600 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
2f610 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
2f620 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
2f630 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
2f640 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
2f650 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
2f660 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
2f670 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
2f680 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
2f690 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2f6a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2f6b0 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
2f6c0 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
2f6d0 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
2f6e0 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
2f6f0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
2f700 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
2f710 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
2f720 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73   READ_LOCK);.  s
2f730 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f740 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2f750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
2f760 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2f770 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
2f780 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
2f790 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
2f7a0 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
2f7b0 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
2f7c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
2f7d0 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
2f7e0 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
2f7f0 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
2f800 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2f810 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2f820 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
2f830 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
2f840 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
2f850 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
2f860 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
2f870 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2f880 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
2f890 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2f8a0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2f8b0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2f8c0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
2f8d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
2f8e0 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  ge1!=0 );.    pP
2f8f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
2f900 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
2f910 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f920 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2f930 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2f940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f950 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2f960 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
2f970 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 20 20  4], iMeta);.    
2f980 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a    if( idx==7 ){.
2f990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f9a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f9b0 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20  || iMeta==0 );. 
2f9c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2f9d0 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
2f9e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
2f9f0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
2fa00 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a   iMeta;.      }.
2fa10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2fa20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2fa30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2fa40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2fa50 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20  he flag byte at 
2fa60 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2fa70 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
2fa80 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2fa90 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2faa0 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
2fab0 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28  lite3BtreeFlags(
2fac0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2fad0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2fae0 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45   about CURSOR_RE
2faf0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f  QUIRESEEK state?
2fb00 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74   Probably need t
2fb10 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74  o call.  ** rest
2fb20 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2fb30 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
2fb40 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
2fb50 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2fb60 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2fb70 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2fb80 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2fb90 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d  rt( pPage->pBt==
2fba0 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72  pCur->pBt );.  r
2fbb0 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
2fbc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2fbd0 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
2fbe0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2fbf0 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73  rn the pager ass
2fc00 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42  ociated with a B
2fc10 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Tree.  This rout
2fc20 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ine is used for.
2fc30 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2fc40 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2fc50 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  /.Pager *sqlite3
2fc60 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65  BtreePager(Btree
2fc70 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
2fc80 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d  ->pBt->pPager;.}
2fc90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2fca0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2fcb0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65  CHECK./*.** Appe
2fcc0 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20  nd a message to 
2fcd0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2fce0 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
2fcf0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70  tic void checkAp
2fd00 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67  pendMsg(.  Integ
2fd10 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a  rityCk *pCheck,.
2fd20 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20    char *zMsg1,. 
2fd30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2fd40 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  rmat,.  ....){. 
2fd50 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2fd60 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66  har *zMsg2;.  if
2fd70 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  ( !pCheck->mxErr
2fd80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68   ) return;.  pCh
2fd90 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20  eck->mxErr--;.  
2fda0 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a  pCheck->nErr++;.
2fdb0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2fdc0 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32  Format);.  zMsg2
2fdd0 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
2fde0 74 66 28 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  tf(0, zFormat, a
2fdf0 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2fe00 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30  ;.  if( zMsg1==0
2fe10 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20   ) zMsg1 = "";. 
2fe20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72   if( pCheck->zEr
2fe30 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
2fe40 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d   *zOld = pCheck-
2fe50 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43  >zErrMsg;.    pC
2fe60 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  heck->zErrMsg = 
2fe70 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
2fe80 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
2fe90 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20  >zErrMsg, zOld, 
2fea0 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  "\n", zMsg1, zMs
2feb0 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
2fec0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2fed0 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOld);.  }else{.
2fee0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2fef0 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45  ring(&pCheck->zE
2ff00 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d  rrMsg, zMsg1, zM
2ff10 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sg2, (char*)0);.
2ff20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2ff30 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e  ee(zMsg2);.}.#en
2ff40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2ff50 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2ff60 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
2ff70 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2ff80 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
2ff90 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
2ffa0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
2ffb0 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
2ffc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
2ffd0 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
2ffe0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
2fff0 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
30000 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
30010 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
30020 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
30030 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
30040 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
30050 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
30060 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
30070 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
30080 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
30090 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
300a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
300b0 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
300c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
300d0 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
300e0 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69  k *pCheck, int i
300f0 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
30100 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
30110 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
30120 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
30130 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69  heck->nPage || i
30140 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68  Page<0 ){.    ch
30150 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30160 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
30170 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  invalid page num
30180 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b  ber %d", iPage);
30190 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
301a0 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d   }.  if( pCheck-
301b0 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31  >anRef[iPage]==1
301c0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
301d0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
301e0 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65  Context, "2nd re
301f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
30200 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30210 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
30220 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b   return  (pCheck
30230 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b  ->anRef[iPage]++
30240 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  )>1;.}..#ifndef 
30250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30260 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65  VACUUM./*.** Che
30270 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ck that the entr
30280 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
30290 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43  -map for page iC
302a0 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a  hild maps to .**
302b0 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70   page iParent, p
302c0 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54  ointer type ptrT
302d0 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70  ype. If not, app
302e0 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  end an error mes
302f0 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63  sage.** to pChec
30300 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
30310 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20  d checkPtrmap(. 
30320 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
30330 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67  heck,   /* Integ
30340 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65  rity check conte
30350 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  xt */.  Pgno iCh
30360 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ild,           /
30370 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  * Child page num
30380 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ber */.  u8 eTyp
30390 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
303a0 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
303b0 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a  ter map type */.
303c0 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20    Pgno iParent, 
303d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
303e0 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
303f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
30400 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
30410 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
30420 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72  /* Context descr
30430 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72  iption (used for
30440 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29   error msg) */.)
30450 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38  {.  int rc;.  u8
30460 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20   ePtrmapType;.  
30470 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65  Pgno iPtrmapPare
30480 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d  nt;..  rc = ptrm
30490 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42  apGet(pCheck->pB
304a0 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72  t, iChild, &ePtr
304b0 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61  mapType, &iPtrma
304c0 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
304d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
304e0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
304f0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30500 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f  text, "Failed to
30510 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79   read ptrmap key
30520 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20  =%d", iChild);. 
30530 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
30540 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70    if( ePtrmapTyp
30550 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72  e!=eType || iPtr
30560 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65  mapParent!=iPare
30570 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  nt ){.    checkA
30580 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30590 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
305a0 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65    "Bad ptr map e
305b0 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65  ntry key=%d expe
305c0 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74  cted=(%d,%d) got
305d0 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20  =(%d,%d)", .    
305e0 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c    iChild, eType,
305f0 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61   iParent, ePtrma
30600 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61  pType, iPtrmapPa
30610 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  rent);.  }.}.#en
30620 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
30630 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
30640 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f  f the freelist o
30650 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
30660 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56   page list..** V
30670 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
30680 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
30690 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e  n the list is N.
306a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
306b0 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74  checkList(.  Int
306c0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
306d0 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20  ,  /* Integrity 
306e0 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74  checking context
306f0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65   */.  int isFree
30700 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  List,       /* T
30710 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69  rue for a freeli
30720 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f  st.  False for o
30730 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
30740 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  t */.  int iPage
30750 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30760 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
30770 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68  first page in th
30780 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
30790 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
307a0 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
307b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
307c0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63   the list */.  c
307d0 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
307e0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
307f0 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
30800 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
30810 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64  ;.  int expected
30820 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72   = N;.  int iFir
30830 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68  st = iPage;.  wh
30840 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20  ile( N-- > 0 && 
30850 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b  pCheck->mxErr ){
30860 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76  .    DbPage *pOv
30870 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69  flPage;.    unsi
30880 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c  gned char *pOvfl
30890 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50  Data;.    if( iP
308a0 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
308b0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
308c0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
308d0 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
308e0 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
308f0 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
30900 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
30910 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
30920 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
30930 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
30940 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
30950 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
30960 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
30970 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
30980 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
30990 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  rGet(pCheck->pPa
309a0 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
309b0 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b  , &pOvflPage) ){
309c0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
309d0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
309e0 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20  ontext, "failed 
309f0 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c  to get page %d",
30a00 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62   iPage);.      b
30a10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
30a20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73  pOvflData = (uns
30a30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
30a40 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
30a50 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20  (pOvflPage);.   
30a60 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20   if( isFreeList 
30a70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
30a80 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30a90 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Data[4]);.#ifnde
30aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30ab0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
30ac0 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
30ad0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
30ae0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
30af0 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
30b00 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30b10 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30b20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30b30 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
30b40 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
30b50 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
30b60 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30b70 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30b80 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
30b90 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
30ba0 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
30bb0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30bc0 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
30bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30be0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
30bf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30c00 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
30c10 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30c20 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Data[8+i*4]);.#i
30c30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30c40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30c50 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
30c60 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
30c70 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
30c80 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
30c90 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
30ca0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30cb0 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30cd0 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
30ce0 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
30cf0 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
30d00 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
30d10 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
30d20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
30d30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30d40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
30d50 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
30d60 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
30d70 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
30d80 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
30d90 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
30da0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
30db0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
30dc0 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
30dd0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
30de0 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
30df0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
30e00 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
30e10 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
30e20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
30e30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
30e40 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
30e50 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
30e60 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  flData);.       
30e70 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
30e80 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f  eck, i, PTRMAP_O
30e90 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c  VERFLOW2, iPage,
30ea0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
30eb0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
30ec0 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74  .    iPage = get
30ed0 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
30ee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
30ef0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67  erUnref(pOvflPag
30f00 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
30f10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30f20 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
30f30 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
30f40 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
30f50 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f  Y_CHECK./*.** Do
30f60 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20   various sanity 
30f70 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67  checks on a sing
30f80 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65  le page of a tre
30f90 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
30fa0 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52  e tree depth.  R
30fb0 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e  oot pages return
30fc0 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20   0.  Parents of 
30fd0 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65  root pages.** re
30fe0 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66  turn 1, and so f
30ff0 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  orth..** .** The
31000 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f  se checks are do
31010 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ne:.**.**      1
31020 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
31030 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65  t cells and free
31040 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76  blocks do not ov
31050 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20  erlap.**        
31060 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f    but combine to
31070 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65   completely cove
31080 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20  r the page..**  
31090 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72  NO  2.  Make sur
310a0 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20  e cell keys are 
310b0 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f  in order..**  NO
310c0 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    3.  Make sure 
310d0 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  no key is less t
310e0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
310f0 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zLowerBound..** 
31100 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75   NO  4.  Make su
31110 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65  re no key is gre
31120 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
31130 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e  al to zUpperBoun
31140 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43  d..**      5.  C
31150 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
31160 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  ty of overflow p
31170 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e  ages..**      6.
31180 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61    Recursively ca
31190 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  ll checkTreePage
311a0 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   on all children
311b0 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65  ..**      7.  Ve
311c0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
311d0 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  pth of all child
311e0 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e  ren is the same.
311f0 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b  .**      8.  Mak
31200 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65  e sure this page
31210 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25   is at least 33%
31220 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74   full or else it
31230 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
31240 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
31250 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
31260 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67  int checkTreePag
31270 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  e(.  IntegrityCk
31280 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f   *pCheck,  /* Co
31290 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61  ntext for the sa
312a0 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20  nity check */.  
312b0 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
312c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
312d0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
312e0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d   to check */.  M
312f0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
31300 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
31310 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  age */.  char *z
31320 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
31330 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
31340 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
31350 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
31360 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
31370 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
31380 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
31390 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
313a0 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
313b0 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
313c0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
313d0 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
313e0 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
313f0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
31400 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
31410 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
31420 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50   "Page %d: ", iP
31430 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  age);..  /* Chec
31440 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
31450 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42  exists.  */.  pB
31460 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b  t = pCheck->pBt;
31470 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
31480 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
31490 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20  .  if( iPage==0 
314a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
314b0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
314c0 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e  k, iPage, zParen
314d0 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75  tContext) ) retu
314e0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20  rn 0;.  if( (rc 
314f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
31500 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
31510 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20  )iPage, &pPage, 
31520 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  0))!=0 ){.    ch
31530 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31540 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
31550 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
31560 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65   get the page. e
31570 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72  rror code=%d", r
31580 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  c);.    return 0
31590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20  ;.  }.  if( (rc 
315a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
315b0 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
315c0 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20  arent))!=0 ){.  
315d0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
315e0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
315f0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
31600 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42         "sqlite3B
31610 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72  treeInitPage() r
31620 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64  eturns error cod
31630 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e %d", rc);.    
31640 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31650 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
31660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
31670 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65  k out all the ce
31680 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74  lls..  */.  dept
31690 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
316a0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
316b0 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
316c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  r; i++){.    u8 
316d0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
316e0 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  sz;.    CellInfo
316f0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43   info;..    /* C
31700 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65  heck payload ove
31710 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
31720 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
31730 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
31740 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
31750 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt,.            
31760 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25   "On tree page %
31770 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50  d cell %d: ", iP
31780 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65  age, i);.    pCe
31790 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
317a0 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69  age,i);.    sqli
317b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
317c0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
317d0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73  l, &info);.    s
317e0 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
317f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31800 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
31810 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73  nfo.nKey;.    as
31820 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e  sert( sz==info.n
31830 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69  Payload );.    i
31840 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  f( sz>info.nLoca
31850 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  l ){.      int n
31860 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66  Page = (sz - inf
31870 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c  o.nLocal + usabl
31880 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62  eSize - 5)/(usab
31890 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
318a0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
318b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
318c0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
318d0 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  w]);.#ifndef SQL
318e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
318f0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
31900 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31910 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
31920 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
31930 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
31940 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20  ERFLOW1, iPage, 
31950 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31970 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b  checkList(pCheck
31980 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e  , 0, pgnoOvfl, n
31990 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
319a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
319b0 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c  heck sanity of l
319c0 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  eft child page..
319d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
319e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
319f0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
31a00 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66  byte(pCell);.#if
31a10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31a20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31a30 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31a40 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
31a50 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
31a60 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
31a70 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
31a80 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31a90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31aa0 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61  d2 = checkTreePa
31ab0 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70  ge(pCheck,pgno,p
31ac0 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a  Page,zContext);.
31ad0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
31ae0 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20   d2!=depth ){.  
31af0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
31b00 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31b10 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61  ntext, "Child pa
31b20 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
31b30 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
31b40 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20    depth = d2;.  
31b50 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70    }.  }.  if( !p
31b60 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31b70 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31b80 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
31b90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31ba0 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  +8]);.    sqlite
31bb0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31bc0 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
31bd0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
31be0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
31bf0 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68   page %d at righ
31c00 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67  t child: ", iPag
31c10 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
31c20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31c30 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
31c40 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31c50 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31c60 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
31c70 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
31c80 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
31c90 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
31ca0 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
31cb0 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74  no, pPage, zCont
31cc0 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ext);.  }. .  /*
31cd0 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
31ce0 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
31cf0 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
31d00 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
31d10 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
31d20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
31d30 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   hit = sqlite3Ma
31d40 6c 6c 6f 63 5a 65 72 6f 28 20 75 73 61 62 6c 65  llocZero( usable
31d50 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69  Size );.  if( hi
31d60 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
31d70 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65  hit, 1, get2byte
31d80 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b  (&data[hdr+5]));
31d90 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  .    nCell = get
31da0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
31db0 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61  3]);.    cellSta
31dc0 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  rt = hdr + 12 - 
31dd0 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
31de0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
31df0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
31e00 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
31e10 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61  te(&data[cellSta
31e20 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  rt+i*2]);.      
31e30 69 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53  int size = cellS
31e40 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
31e50 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
31e60 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
31e70 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73   (pc+size-1)>=us
31e80 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30  ableSize || pc<0
31e90 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31ea0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31eb0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
31ec0 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
31ed0 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
31ee0 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
31ef0 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
31f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31f10 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b  for(j=pc+size-1;
31f20 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74   j>=pc; j--) hit
31f30 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
31f40 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74     }.    for(cnt
31f50 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26  =0, i=get2byte(&
31f60 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e  data[hdr+1]); i>
31f70 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a  0 && i<usableSiz
31f80 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20  e && cnt<10000; 
31f90 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  .           cnt+
31fa0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  +){.      int si
31fb0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
31fc0 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  ata[i+2]);.     
31fd0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
31fe0 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73  ( (i+size-1)>=us
31ff0 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20  ableSize || i<0 
32000 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
32010 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32020 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20  , 0,  .         
32030 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
32040 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
32050 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
32060 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
32070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32080 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20  for(j=i+size-1; 
32090 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  j>=i; j--) hit[j
320a0 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
320b0 20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28     i = get2byte(
320c0 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d  &data[i]);.    }
320d0 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30  .    for(i=cnt=0
320e0 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20  ; i<usableSize; 
320f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
32100 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  hit[i]==0 ){.   
32110 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
32120 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b    }else if( hit[
32130 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  i]>1 ){.        
32140 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
32150 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20  Check, 0,.      
32160 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73      "Multiple us
32170 65 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f  es for byte %d o
32180 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69  f page %d", i, i
32190 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Page);.        b
321a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
321b0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
321c0 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a  =data[hdr+7] ){.
321d0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
321e0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
321f0 0a 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67  .          "Frag
32200 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20  mented space is 
32210 25 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64  %d byte reported
32220 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25   as %d on page %
32230 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e  d",.          cn
32240 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20  t, data[hdr+7], 
32250 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iPage);.    }.  
32260 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
32270 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73  (hit);..  releas
32280 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
32290 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a  return depth+1;.
322a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
322b0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
322c0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
322d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
322e0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
322f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
32300 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65  ne does a comple
32310 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20  te check of the 
32320 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65  given BTree file
32330 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a  .  aRoot[] is.**
32340 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67   an array of pag
32350 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20  es numbers were 
32360 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72  each page number
32370 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
32380 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e  e of.** a table.
32390 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e    nRoot is the n
323a0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
323b0 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   in aRoot..**.**
323c0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63   If everything c
323d0 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20  hecks out, this 
323e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
323f0 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68  NULL.  If someth
32400 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c  ing is.** amiss,
32410 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
32420 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
32430 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
32440 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a  d from malloc().
32450 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ** and a pointer
32460 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d   to that error m
32470 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e  essage is return
32480 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ed.  The calling
32490 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
324a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
324b0 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f  freeing the erro
324c0 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69  r message when i
324d0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68  t is done..*/.ch
324e0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
324f0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
32500 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
32510 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
32520 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
32530 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
32540 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
32550 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
32560 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
32570 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
32580 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
32590 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
325a0 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
325b0 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
325c0 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
325d0 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
325e0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
325f0 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
32600 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
32610 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
32620 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  riable */.){.  i
32630 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
32640 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
32650 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
32660 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
32670 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
32680 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 52 65  eEnter(p);.  nRe
32690 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
326a0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
326b0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63  ager);.  if( loc
326c0 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
326d0 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  p)!=SQLITE_OK ){
326e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
326f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
32700 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
32710 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
32720 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
32730 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32740 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
32750 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
32760 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
32770 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
32780 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71  Check.nPage = sq
32790 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
327a0 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
327b0 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
327c0 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
327d0 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
327e0 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66   *pnErr = 0;.#if
327f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32800 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
32810 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30  ( pBt->nTrunc!=0
32820 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e   ){.    sCheck.n
32830 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Page = pBt->nTru
32840 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  nc;.  }.#endif. 
32850 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67   if( sCheck.nPag
32860 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  e==0 ){.    unlo
32870 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
32880 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
32890 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
328a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
328b0 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
328c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
328d0 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65  c( (sCheck.nPage
328e0 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
328f0 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20  k.anRef[0]) );. 
32900 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52   if( !sCheck.anR
32910 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  ef ){.    unlock
32920 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
32930 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d  t);.    *pnErr =
32940 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
32950 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32960 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32970 4d 50 72 69 6e 74 66 28 70 2d 3e 70 53 71 6c 69  MPrintf(p->pSqli
32980 74 65 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d  te, "Unable to m
32990 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c  alloc %d bytes",
329a0 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63   .        (sChec
329b0 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
329c0 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
329d0 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ]));.  }.  for(i
329e0 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
329f0 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
32a00 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
32a10 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
32a20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
32a30 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
32a40 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
32a50 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
32a60 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a  ;.  }.  sCheck.z
32a70 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f  ErrMsg = 0;..  /
32a80 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
32a90 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
32aa0 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65  elist.  */.  che
32ab0 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20  ckList(&sCheck, 
32ac0 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74  1, get4byte(&pBt
32ad0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
32ae0 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  32]),.          
32af0 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d    get4byte(&pBt-
32b00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
32b10 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c  6]), "Main freel
32b20 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43  ist: ");..  /* C
32b30 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62  heck all the tab
32b40 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
32b50 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20  i=0; i<nRoot && 
32b60 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
32b70 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f  +){.    if( aRoo
32b80 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  t[i]==0 ) contin
32b90 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
32ba0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32bb0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
32bc0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52  autoVacuum && aR
32bd0 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  oot[i]>1 ){.    
32be0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73    checkPtrmap(&s
32bf0 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
32c00 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
32c10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
32c20 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
32c30 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c  reePage(&sCheck,
32c40 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c   aRoot[i], 0, "L
32c50 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74  ist of tree root
32c60 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s: ");.  }..  /*
32c70 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
32c80 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
32c90 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a  e is referenced.
32ca0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
32cb0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
32cc0 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
32cd0 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
32ce0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32cf0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68  CUUM.    if( sCh
32d00 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32d10 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32d20 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32d30 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
32d40 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
32d50 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
32d60 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
32d70 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
32d80 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73  o-vacuum, make s
32d90 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f  ure no tables co
32da0 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66  ntain.    ** ref
32db0 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74  erences to point
32dc0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20  er-map pages..  
32dd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68    */.    if( sCh
32de0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32df0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
32e00 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32e10 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75  )!=i || !pBt->au
32e20 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
32e30 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32e40 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
32e50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
32e60 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
32e70 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
32e80 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a  anRef[i]!=0 && .
32e90 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
32ea0 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69  AGENO(pBt, i)==i
32eb0 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   && pBt->autoVac
32ec0 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
32ed0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
32ee0 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65  heck, 0, "Pointe
32ef0 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73  r map page %d is
32f00 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29   referenced", i)
32f10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32f20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
32f30 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  re this analysis
32f40 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61   did not leave a
32f50 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73  ny unref() pages
32f60 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74  .  */.  unlockBt
32f70 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
32f80 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20  ;.  if( nRef != 
32f90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
32fa0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
32fb0 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  ) ){.    checkAp
32fc0 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32fd0 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73   0, .      "Outs
32fe0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75  tanding page cou
32ff0 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20  nt goes from %d 
33000 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69  to %d during thi
33010 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20  s analysis",.   
33020 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33     nRef, sqlite3
33030 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
33040 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29  t->pPager).    )
33050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
33060 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74  n  up and report
33070 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
33080 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
33090 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
330a0 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65  free(sCheck.anRe
330b0 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73  f);.  *pnErr = s
330c0 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65  Check.nErr;.  re
330d0 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72  turn sCheck.zErr
330e0 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Msg;.}.#endif /*
330f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
33100 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
33110 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33120 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
33130 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
33140 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
33150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
33160 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
33170 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
33180 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
33190 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
331a0 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
331b0 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
331c0 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
331d0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
331e0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
331f0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
33200 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
33210 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
33220 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
33230 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
33240 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
33250 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
33260 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
33270 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
33280 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
33290 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
332a0 54 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  The pager direct
332b0 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61  ory name is inva
332c0 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
332d0 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
332e0 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
332f0 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
33300 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
33310 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
33320 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
33330 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
33340 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33350 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33360 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
33370 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
33380 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
33390 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
333a0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
333b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
333c0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
333d0 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
333e0 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
333f0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
33400 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
33410 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
33420 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
33430 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
33440 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
33450 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a  *.** The pager j
33460 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
33470 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
33480 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
33490 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
334a0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
334b0 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
334c0 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
334d0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
334e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
334f0 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65  ournalname(Btree
33500 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
33510 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
33520 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
33530 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
33540 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  lname(p->pBt->pP
33550 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ager);.}..#ifnde
33560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
33570 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  CUUM./*.** Copy 
33580 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
33590 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20  tent of pBtFrom 
335a0 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74  into pBtTo.  A t
335b0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
335c0 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72  st be active for
335d0 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a   both files..**.
335e0 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66  ** The size of f
335f0 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20  ile pBtFrom may 
33600 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68  be reduced by th
33610 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
33620 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
33630 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61  s wrong, the tra
33640 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46  nsaction on pBtF
33650 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  rom is rolled ba
33660 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
33670 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28  t btreeCopyFile(
33680 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65  Btree *pTo, Btre
33690 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74  e *pFrom){.  int
336a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
336b0 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65  .  Pgno i, nPage
336c0 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70  , nToPage, iSkip
336d0 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ;..  BtShared *p
336e0 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b  BtTo = pTo->pBt;
336f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
33700 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42  From = pFrom->pB
33710 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  t;..  if( pTo->i
33720 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
33730 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
33740 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
33750 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
33760 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
33770 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
33780 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  pCursor ) return
33790 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
337a0 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65  nToPage = sqlite
337b0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
337c0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
337d0 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
337e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
337f0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
33800 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
33810 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33820 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  tTo);.  for(i=1;
33830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33840 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29  & i<=nPage; i++)
33850 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33860 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33870 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33880 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33890 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
338a0 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c  From->pPager, i,
338b0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
338c0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
338d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
338e0 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 70  PagerOverwrite(p
338f0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
33900 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33910 44 61 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a  Data(pDbPage));.
33920 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33930 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33940 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33950 20 66 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69   file is shrinki
33960 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20  ng, journal the 
33970 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 62  pages that are b
33980 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20  eing truncated. 
33990 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79   ** so that they
339a0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
339b0 61 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  ack if the commi
339c0 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  t fails..  */.  
339d0 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72  for(i=nPage+1; r
339e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
339f0 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29  i<=nToPage; i++)
33a00 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33a10 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33a20 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33a30 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33a40 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33a50 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
33a60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33a70 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33a90 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
33aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
33ab0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
33ac0 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65  Page);.    /* Ye
33ad0 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
33ae0 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
33af0 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
33b00 74 65 72 20 57 72 69 74 65 28 29 2e 20 20 42 75  ter Write().  Bu
33b10 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33b20 20 62 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d   because the nam
33b30 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63  es of those proc
33b40 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78  edures do not ex
33b50 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65  actly .    ** re
33b60 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65  present what the
33b70 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72  y do.  Write() r
33b80 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74  eally means "put
33b90 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68   this page in th
33ba0 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  e.    ** rollbac
33bb0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
33bc0 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
33bd0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
33be0 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
33bf0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33c00 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44   file later."  D
33c10 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65  ontWrite() undoe
33c20 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
33c30 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74  t of.    ** that
33c40 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68   and prevents th
33c50 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  e page from bein
33c60 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  g written to the
33c70 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a   database.  The.
33c80 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
33c90 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
33ca0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
33cb0 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
33cc0 69 73 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20  is the whole.   
33cd0 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69   ** point of thi
33ce0 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70  s loop: to put p
33cf0 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
33d00 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  back journal. */
33d10 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
33d20 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
33d30 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26  .  }.  if( !rc &
33d40 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20  & nPage<nToPage 
33d50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
33d60 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
33d70 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
33d80 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  nPage);.  }..  i
33d90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
33da0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
33db0 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  k(pTo);.  }.  re
33dc0 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
33dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
33de0 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
33df0 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
33e00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
33e10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
33e20 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  To);.  sqlite3Bt
33e30 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b  reeEnter(pFrom);
33e40 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70  .  rc = btreeCop
33e50 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d  yFile(pTo, pFrom
33e60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33e70 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20  eLeave(pFrom);. 
33e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
33e90 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72  ve(pTo);.  retur
33ea0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
33eb0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
33ec0 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
33ed0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
33ee0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
33ef0 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
33f00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
33f10 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  sInTrans(Btree *
33f20 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  p){.  assert( p=
33f30 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
33f40 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c  tex_held(p->pSql
33f50 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
33f60 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
33f70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
33f80 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a  _WRITE));.}../*.
33f90 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
33fa0 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  ro if a statemen
33fb0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
33fc0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
33fd0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
33fe0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
33ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34000 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
34010 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  (p) );.  return 
34020 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42  (p->pBt && p->pB
34030 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  t->inStmt);.}../
34040 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
34050 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28  zero if a read (
34060 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
34070 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
34080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
34090 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
340a0 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  s(Btree *p){.  a
340b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
340c0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71  utex_held(p->pSq
340d0 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  lite->mutex) );.
340e0 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
340f0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
34100 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a  S_NONE));.}../*.
34110 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34120 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
34130 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20  er to a blob of 
34140 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
34150 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
34160 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  le shared-btree.
34170 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75   The memory is u
34180 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f  sed by client co
34190 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a  de for it's own.
341a0 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72  ** purposes (for
341b0 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f   example, to sto
341c0 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20  re a high-level 
341d0 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65  schema associate
341e0 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73  d with .** the s
341f0 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68  hared-btree). Th
34200 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61  e btree layer ma
34210 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20  nages reference 
34220 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e  counting issues.
34230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
34240 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61   time this is ca
34250 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64  lled on a shared
34260 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62  -btree, nBytes b
34270 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
34280 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c  * are allocated,
34290 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74   zeroed, and ret
342a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
342b0 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75  ler. For each su
342c0 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c  bsequent .** cal
342d0 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72  l the nBytes par
342e0 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
342f0 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  d and a pointer 
34300 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62  to the same blob
34310 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  .** of memory re
34320 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a  turned. .**.** J
34330 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73  ust before the s
34340 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63  hared-btree is c
34350 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  losed, the funct
34360 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
34370 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75  e .** xFree argu
34380 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65  ment when the me
34390 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
343a0 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f  was made is invo
343b0 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62  ked on the .** b
343c0 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  lob of allocated
343d0 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75   memory. This fu
343e0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
343f0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  t call sqlite3_f
34400 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ree().** on the 
34410 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65  memory, the btre
34420 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61  e layer does tha
34430 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  t..*/.void *sqli
34440 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42  te3BtreeSchema(B
34450 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79  tree *p, int nBy
34460 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65  tes, void(*xFree
34470 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74  )(void *)){.  Bt
34480 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
34490 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
344a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
344b0 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d  if( !pBt->pSchem
344c0 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  a ){.    pBt->pS
344d0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d  chema = sqlite3M
344e0 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73  allocZero(nBytes
344f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65  );.    pBt->xFre
34500 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b  eSchema = xFree;
34510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
34520 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
34530 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65  eturn pBt->pSche
34540 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ma;.}../*.** Ret
34550 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74  urn true if anot
34560 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20  her user of the 
34570 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65  same shared btre
34580 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  e as the argumen
34590 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64  t.** handle hold
345a0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
345b0 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74  ock on the sqlit
345c0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
345d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
345e0 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28  reeSchemaLocked(
345f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
34600 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
34610 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34620 64 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75  d(p->pSqlite->mu
34630 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
34640 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
34650 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61 62    rc = (queryTab
34660 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
34670 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
34680 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  )!=SQLITE_OK);. 
34690 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
346a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
346b0 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
346c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
346d0 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f  ED_CACHE./*.** O
346e0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
346f0 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  the table whose 
34700 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61  root page is iTa
34710 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20  b.  The.** lock 
34720 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  is a write lock 
34730 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69  if isWritelock i
34740 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64  s true or a read
34750 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69   lock.** if it i
34760 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
34770 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
34780 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
34790 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57  int iTab, u8 isW
347a0 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  riteLock){.  int
347b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
347c0 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d  .  u8 lockType =
347d0 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52   (isWriteLock?WR
347e0 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f  ITE_LOCK:READ_LO
347f0 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  CK);.  sqlite3Bt
34800 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
34810 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
34820 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  ck(p, iTab, lock
34830 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Type);.  if( rc=
34840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34850 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
34860 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
34870 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
34880 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
34890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
348a0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
348b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
348c0 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLOB./*.** Argum
348d0 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65  ent pCsr must be
348e0 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
348f0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20   for writing on 
34900 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61  an .** INTKEY ta
34910 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ble currently po
34920 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
34930 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a  d table entry. .
34940 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34950 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61   modifies the da
34960 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ta stored as par
34970 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e  t of that entry.
34980 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74  .** Only the dat
34990 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e  a content may on
349a0 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ly be modified, 
349b0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
349c0 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  le.** to change 
349d0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
349e0 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a  e data stored..*
349f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
34a00 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73  eePutData(BtCurs
34a10 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66  or *pCsr, u32 of
34a20 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
34a30 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72  oid *z){.  asser
34a40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
34a50 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61  tex(pCsr) );.  a
34a60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34a70 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e  utex_held(pCsr->
34a80 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d  pBtree->pSqlite-
34a90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
34aa0 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72  ert(pCsr->isIncr
34ab0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69  blobHandle);.  i
34ac0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3e  f( pCsr->eState>
34ad0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
34ae0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
34af0 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
34b00 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
34b10 20 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e     return pCsr->
34b20 73 6b 69 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  skip;.    }else{
34b30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
34b40 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
34b50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
34b60 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74  k some precondit
34b70 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61  ions: .  **   (a
34b80 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  ) the cursor is 
34b90 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
34ba0 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65  ,.  **   (b) the
34bb0 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f  re is no read-lo
34bc0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
34bd0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61  being modified a
34be0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68  nd.  **   (c) th
34bf0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
34c00 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f  at a valid row o
34c10 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  f an intKey tabl
34c20 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
34c30 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Csr->wrFlag ){. 
34c40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34c50 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
34c60 20 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e   assert( !pCsr->
34c70 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20  pBt->readOnly . 
34c80 20 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72           && pCsr
34c90 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
34ca0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
34cb0 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  E );.  if( check
34cc0 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e  ReadLocks(pCsr->
34cd0 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67  pBtree, pCsr->pg
34ce0 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b  noRoot, pCsr) ){
34cf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34d00 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
34d10 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
34d20 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
34d30 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
34d40 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65  if( pCsr->eState
34d50 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
34d60 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65   || !pCsr->pPage
34d70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
34d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
34d90 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
34da0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
34db0 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCsr, offset, a
34dc0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
34dd0 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d  ar *)z, 0, 1);.}
34de0 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66  ../* .** Set a f
34df0 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73  lag on this curs
34e00 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68 65 20  or to cache the 
34e10 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67  locations of pag
34e20 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  es from the .** 
34e30 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f  overflow list fo
34e40 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
34e50 77 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  w. This is used 
34e60 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  by cursors opene
34e70 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65  d.** for increme
34e80 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c  ntal blob IO onl
34e90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  y..**.** This fu
34ea0 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c  nction sets a fl
34eb0 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74  ag only. The act
34ec0 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f  ual page locatio
34ed0 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72  n cache.** (stor
34ee0 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61  ed in BtCursor.a
34ef0 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61  Overflow[]) is a
34f00 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65  llocated and use
34f10 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  d by function.**
34f20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
34f30 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e   (the worker fun
34f40 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65  ction for sqlite
34f50 33 42 74 72 65 65 44 61 74 61 28 29 20 61 6e 64  3BtreeData() and
34f60 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
34f70 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76  PutData())..*/.v
34f80 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
34f90 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74  CacheOverflow(Bt
34fa0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
34fb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
34fc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
34fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
34fe0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34ff0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53  pCur->pBtree->pS
35000 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b  qlite->mutex) );
35010 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d  .  assert(!pCur-
35020 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
35030 65 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43  e);.  assert(!pC
35040 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
35050 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c    pCur->isIncrbl
35060 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a  obHandle = 1;.}.
35070 23 65 6e 64 69 66 0a                             #endif.